【发布时间】:2014-05-30 13:16:06
【问题描述】:
我正在为 Pascal 创建一个解析器,但我被条件语句卡住了。
假设我有这个代码 sn-p:
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 -> '=' | '<' | '<=' | '>' | '>=' | '<>
其中E 是上面算术表达式语法中的E。
这不是 LL(1),因为 CF -> E REL_OP E 和 CF -> '(' E REL-OP E ')' 规则包含 '(' 的先到先冲突。
任何想法如何解决第一次碰撞?
【问题讨论】:
-
@MitchWheat 项目“编程语言和编译器”类:)
标签: parsing grammar context-free-grammar ll