我试图为我的柠檬解析器使用 void* 类型,但我遇到了一些奇怪的问题。
最初我使用自定义标记类型,一个结构来保存标记的值,然后我切换到 void* 因为我的标记值类型不同。
这是我的一些解析器代码;
expression(A) ::= expression(B) PLUS expression(C). { *((double *)A)= *((double *)B) + *((double *)C) ; }
expression(A) ::= expression(B) MINUS expression(C). { *((double *)A)= *((double *) B) - *((double *)C) ; }
expression(A) ::= expression(B) MULT expression(C). { *((double *)A)= *((double *)B) * *((double *)C) ; }
expression(A) ::= expression(B) DIV expression(C). {
if( *((double *)C) != 0)
*((double *)A)= *((double *)B) / *((double *)C) ;
else
printf("Math Error!");
}
expression(A) ::= number(B). { *((double *)A)= *((double *)B) ;}
number ::= INT.
number ::= FLOAT.
这是我的词法分析器,它是 re2c 文件;
while ((token = lex()) != EOL) {
sy[size].val = tkn.val;
parse(parser, token, &sy[size].val);
size++;
}
sy[size].val
是双重类型。
但是当我运行它时1+2
返回4,当我运行1+4
它时返回8
我的猜测是解析器将最正确的值放入它的堆栈中,并在它看到令牌参数的任何地方使用它。