Parsing LL(1)条件语句语法

Parsing LL(1)条件语句语法,parsing,grammar,context-free-grammar,ll,Parsing,Grammar,Context Free Grammar,Ll,我正在为Pascal创建一个解析器,我被条件语句卡住了 假设我有以下代码片段: if ((10 mod 3) = 1) then ... 这是有效的pascal if语句。然而,当我试图为((10 mod 3)=1)表达式想出LL(1)语法时,我在括号中崩溃了。问题是,如果(10 mod 3)=1,则上述条件可以重写为,如果(10 mod 3)=1,则…,或者由于运算符优先级,可以重写为,如果10 mod 3=1,则… 我有算术表达式的典型LL(1)语法: E -> TE' E' -&

我正在为Pascal创建一个解析器,我被条件语句卡住了

假设我有以下代码片段:

if ((10 mod 3) = 1) then ...
这是有效的pascal if语句。然而,当我试图为
((10 mod 3)=1)
表达式想出LL(1)语法时,我在括号中崩溃了。问题是,如果(10 mod 3)=1,则上述条件可以重写为
,如果(10 mod 3)=1,则…
,或者由于运算符优先级,可以重写为
,如果10 mod 3=1,则…

我有算术表达式的典型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 -> '=' | '<' | '<=' | '>' | '>=' | '<>
CE->CT-CE'
CE'->'或'CT CE'|爱普生
CT->CF CT'
CT'->'和'CF CT'|ε
CF->E REL-OP E |'('E REL-OP E')'|'而不是'E REL-OP E'
REL-OP->'='|'='|'
其中
E
是上述算术表达式语法中的
E

这不是LL(1),因为
CF->E REL_OP E
CF->'('E REL-OP E')
规则包含
'('
的第一次冲突


你知道如何修复第一次冲突吗?

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

因此,您需要扩展
表达式
(或者在编写时扩展
E
),使
(10 mod 3)=1
表达式
(因此
((10 mod 3)=1)
表达式
),然后
if
语句以
“if”expression“then”开头

如果您真的想为
条件表达式
CE
)创建一个单独的语法类别,那么您必须一直到优先级层次结构的底部,这样您将得到一个列表,该列表以

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

CF  -> 'number' | '(' CE ')'
最后一个结果将是现有表达式语法的简单副本,并一致更改为非终端名称。但这是大量不必要的重复。

@MitchWheat project for“Programming languages and compilers”类:)