フォームの評価と表現を試みています
#SomeFunc[expr][expr]expr
expr は、特定の文字から構成される文字列または上記の関数のいずれかです。したがって、これは次のようになります
#SomeFunc[#SomeFunc[#SomeFunc[nm^2][nn]][nm]][n]...
問題は、次の形式でトークンにブレーキをかけた場合です。
"#"SomeFunc {yylval.fn=F_some; return FUNC;}
m|n|ms {return TEXT;}
"^" {yylval.fn=F_pow; return FUNC;}
[1-9]+ {yylval=atoi(yytext); return NUMBER;}
次のようなものがある場合、文法の構築に問題があります
#SomeFunc[#SomeFunc[nm^2][nn]][n]
calc:
| calc expr EOL { eval($2); }
expr: TEXT {$$= add it to ast-leaf }
| FUNC '[' expr ']' '[' expr ']' {$$= add ast(func,$3,$6) }
| expr expr {$$= add to ast('*',$1,$2 }
文法が間違っているのか、ASTの実装が間違っているのか、よくわかりません。
nm の場合、expr は expr expr になり、n*m の値を返すため、論理に欠陥があることがわかりました。これはまだ nm です。これは無限ループを引き起こしますか?そのような式をどのように解析すればよいですか。
石を投げないでください。バイソン初心者
後で編集 して、AST といくつかのリンクされたリストの背後にあるコードをクリーンアップしてテストすることができました。唯一の問題は文法のままです。
%union { struct ast *a; char *strval; int ival; }
%type <a> exp fact
%token <strval> ISU
%token <ival> NUMBER
%token FUNC POW
%token EOL OP CP
%%
calclist: | calclist exp EOL { printf("result >",eval($2));};
exp: fact | exp fact {$$ = newast('*', $1,$2);} ;
fact: FUNC OP exp CP OP exp CP { $$ = newast('/',$3,$6);}
| ISU POW NUMBER { $$ = newnum($1, $3);}
| ISU { $$ = newnum($1,1);};
この文法は、Frac[m^2][m^4] node / node K m^4 node K m^4 のような expr では失敗します。