parsing - 不允许使用外括号的表达式语法

标签 parsing expression grammar context-free-grammar bnf

对于涉及二元运算符 (| ^ & << >> + - */) 的表达式,我有以下语法:

expression       : expression BITWISE_OR xor_expression
                 | xor_expression
xor_expression   : xor_expression BITWISE_XOR and_expression
                 | and_expression
and_expression   : and_expression BITWISE_AND shift_expression
                 | shift_expression
shift_expression : shift_expression LEFT_SHIFT arith_expression
                 | shift_expression RIGHT_SHIFT arith_expression
                 | arith_expression
arith_expression : arith_expression PLUS term
                 | arith_expression MINUS term
                 | term
term             : term TIMES factor
                 | term DIVIDE factor
                 | factor
factor           : NUMBER
                 | LPAREN expression RPAREN

这似乎工作正常,但不太符合我的需求,因为它允许外括号,例如((3 + 4) * 2)

如何更改语法以禁止使用外括号,同时仍允许在表达式中使用它们,例如(3 + 4) * 2,甚至是冗余的,例如(3 * 4) + 2?

最佳答案

将此规则添加到您的语法中:

top_level : expression BITWISE_OR xor_expression
          | xor_expression BITWISE_XOR and_expression
          | and_expression BITWISE_AND shift_expression
          | shift_expression LEFT_SHIFT arith_expression
          | shift_expression RIGHT_SHIFT arith_expression
          | arith_expression PLUS term
          | arith_expression MINUS term
          | term TIMES factor
          | term DIVIDE factor
          | NUMBER

并在需要不带外括号的表达式的地方使用 top_level。

关于parsing - 不允许使用外括号的表达式语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001979/

相关文章:

c# - 对包含索引的多行进行分组并为每个索引创建自定义对象列表

java - URLConnection 和 POST 方法 android

http - Dreamweaver 通过 HTTP 连接到站点

grammar - 我应该为单句警报/通知弹出窗口使用正确的标点符号吗?

python - 使用 Python 搜索 Lua 文件中的所有函数调用

php - 您如何访问简单的 DOM 选择器?

java - 2^0*2 和 (2^0)*2 之间的区别?

c++ - C++ 中 std::cout 的奇怪行为

javascript - 评论的语法规则

java - 任何适用于 Java 的 L(AL)R 语法