首页 > 解决方案 > Java-Python翻译器中求和运算的语法问题

问题描述

我正在尝试实现一个 Java-Python 翻译器。我正在使用 flex 来识别一些 java 令牌。我用这个正则表达式管理整数:

...
digit   [0-9]
number  (\+|\-)?{digit}+
...
%%
...
{number} {yylval.i= atoi (yytext);return(NUMBER);}
 "+"     {return (ADD);}

在解析器中,我定义了这个产生式:

ArithmeticExpression
                : ExpressionStatement ADD ExpressionStatement
                | ExpressionStatement SUB ExpressionStatement
                | ExpressionStatement MULT ExpressionStatement
                | ExpressionStatement DIV ExpressionStatement
                | ExpressionStatement MOD ExpressionStatement
                ;

ExpressionStatement
                   : NUMBER
                   ;

如果我输入这样的翻译表达式:

int a = 5 ++67;  (syntax error in java)

我该如何处理这种情况,以便翻译人员将 5 ++67 识别为错误而不是 5 ++67(因此是 ArithmeticExpression)?

标签: cparsingcompiler-constructionsyntax-errorflex-lexer

解决方案


正如评论中已经说过的,您需要引入一个++令牌。

你说你不需要处理一元运算符。即便如此,您仍然需要令牌。5 ++67正是因为++是它自己的令牌,所以在 Java 中是一个错误。如果不是,5 ++67则相当于5 + +67. 因此,如果你想在这种情况下得到与 Java 相同的错误,你还需要一个++令牌——即使你从不使用它。


推荐阅读