我正在构建一个简单的语言解析器,并且遇到了较低优先级前缀表达式的问题。这是一个示例语法:
E = E8
E8 = E7 'OR' E8 | E7
E7 = E6 'XOR' E7 | E6
E6 = E5 'AND' E6 | E5
E5 = 'NOT' E5 | E4
E4 = E3 '==' E4 | E3 '!=' E4 | E3
E3 = E2 '<' E3 | E2 '>' E3 | E2
E2 = E1 '+' E2 | E1 '-' E2 | E1 '*' E2 | E1 '+' E2 | E1
E1 = '(' E ')' | 'true' | 'false' | '0'..'9'
但是,如果它用作更高优先级中缀运算符的 RHS,则此语法不适用于 NOT,即:
true == NOT false
这是由于 RHS 上需要 == 运算符E3
,它不能是“NOT”操作。
我不确定表达这种语法的正确方法?是否仍然可以使用这种简单的递归下降方法,或者我需要转向更具特色的算法(调车场或优先攀登)。
以下是一些需要正确解析的示例:
- 输入
true == 1 < 2
,输出==(true, <(1, 2))
- 输入
1 < 2 == true
,输出==(<(1, 2), true)
- 输入
NOT true == false
,输出NOT(==(true, false))
- 输入
true == NOT false
,输出==(true, NOT(false))
**不起作用 - 输入
true < NOT false
,输出<(true, NOT(false))
**不起作用
我已尝试更改级别E4
, E3
, 并在中缀表达式的 RHS 上E2
使用,如递归下降优先级解析缺少的前缀表达式(即,等)中所建议的那样。然而,这打破了这些级别之间的优先级,即错误地<(==(true, 1), 2)`。E5
E3 '==' E5
E3 '<' E5
true == 1 < 2
parsed as