我正在尝试评估和表达形式
#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,此语法失败