0

我正在为 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来自上面EE算术表达式语法。

这不是 LL(1),因为CF -> E REL_OP EandCF -> '(' E REL-OP E ')'规则包含'('.

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

4

1 回答 1

1

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

因此,您需要以an (因此是 an )的方式扩展expression(或者E,当您编写它时),然后语句以.(10 mod 3) = 1expression((10 mod 3) = 1)expressionif"if" expression "then"

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

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

并以

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

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

于 2014-05-30T14:50:25.023 回答