Parsing LL(1)条件语句语法
我正在为Pascal创建一个解析器,我被条件语句卡住了 假设我有以下代码片段: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' -&
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”类:)