【问题标题】:LL(1) grammar for conditional statements条件语句的 LL(1) 语法
【发布时间】: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 -&gt; E REL_OP ECF -&gt; '(' E REL-OP E ')' 规则包含 '(' 的先到先冲突。

任何想法如何解决第一次碰撞?

【问题讨论】:

  • @MitchWheat 项目“编程语言和编译器”类:)

标签: parsing grammar context-free-grammar ll


【解决方案1】:

如果我没记错的话,Pascal 表达式可以包含比较运算符和布尔运算符,因为它具有布尔类型。所以布尔表达式可以出现在表达式可以出现的任何地方,而不仅仅是在if 语句中。

所以你需要扩展expression(或E,就像你写的那样),使(10 mod 3) = 1expression(因此((10 mod 3) = 1)expression),然后if 语句以 "if" expression "then" 开头。

如果你真的想为conditional expression (CE) 创建一个单独的语法类别,那么你必须一直到优先级层次结构的底部,这样你最终会得到一个列表从类似的东西开始

CE  -> CT CE'
CE' -> "or" CT CE' | epsilon  

结尾
CF  -> 'number' | '(' CE ')'

这些产生式中的最后一个将是现有表达式语法的简单副本,并对非终结名称进行一致的更改。但这是很多不必要的重复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多