我正在为 Pascal 创建一个解析器,但我陷入了条件语句。
假设我有这个代码片段:
if ((10 mod 3) = 1) then ...
这是有效的帕斯卡 if 语句。但是,当我尝试为((10 mod 3) = 1)
表达式提出 LL(1) 语法时,我崩溃并在括号上烧毁。问题是,上面的条件可以重写为if (10 mod 3) = 1 then ...
或由于运算符优先级为if 10 mod 3 = 1 then ...
我有算术表达式的典型 LL(1) 语法:
E -> TE'
E' -> ADD_SUB TE' | epsion
T -> FT'
T' -> MUL_DIV FT' | epsilon
F -> 'number' | '(' E ')'
ADD_SUB -> '+' | '-'
MUL_DIV -> '*' | 'div' | 'mod'
但是我无法为整个条件提出 LL(1) 语法。我想到了类似的东西:
CE -> CT CE'
CE' -> 'or' CT CE' | epsion
CT -> CF CT'
CT' -> 'and' CF CT' | epsilon
CF -> E REL-OP E | '(' E REL-OP E ')' | 'not' E REL-OP E
REL-OP -> '=' | '<' | '<=' | '>' | '>=' | '<>
where来自上面E
的E
算术表达式语法。
这不是 LL(1),因为CF -> E REL_OP E
andCF -> '(' E REL-OP E ')'
规则包含'('
.
任何想法如何解决第一次碰撞?