c - Java-Python 翻译器中求和运算的语法问题

标签 c parsing compiler-construction syntax-error flex-lexer

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

...
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(因此是算术表达式)?

最佳答案

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

你说你不需要处理一元运算符。即便如此,您仍然需要 token 。 5++67 在 Java 中是一个错误,因为 ++ 是它自己的标记。如果不是,5++67 将相当于 5++67。因此,如果您想在本例中得到与 Java 中相同的错误,您还需要有一个 ++ token - 即使您从未使用过它。

关于c - Java-Python 翻译器中求和运算的语法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52237841/

相关文章:

html - 正则表达式抓取表单标签内容不起作用

parsing - 解析时,我需要添加什么才能将 monadUserState 与 alex 一起使用?

java - 为什么 Java 编译器 (javac) 不区分大小写,而 java(解释器)区分大小写?

c++ - 在两个单独的 cpp 文件中定义的内联函数是否可以在链接期间创建重复的符号?

c# - 为什么我会收到此定义引用错误?

c - 从一个函数传递到另一个函数的值发生变化......无法弄清楚为什么?

C 标准库极端情况

c - 搜索并删除 BST 前驱(或后继)

java - Android Json 解析与 multipartEntity

c++ - 将纯lua对象传递给C函数并获取值