GEP*_*GEP -2 algorithm parsing abstract-syntax-tree
7.2.Oberon语法在哪里不是LL(1),也就是说,哪个是必要的多个符号的前瞻?以满足LL(1)属性的方式更改语法以下是Oberon语法:
ident = letter {letter | digit}.
integer = digit {digit}.
selector = {"." ident | "[" expression "]"}.
number = integer.
factor = ident selector | number | "(" expression ")" | "~" factor.
term = factor {("*" | "DIV" | "MOD" | "&") factor}.
SimpleExpression = ["+"|"-"] term {("+"|"-" | "OR") term}.
expression = SimpleExpression
[("=" | "#" | "<" | "<=" | ">" | ">=") SimpleExpression].
assignment = ident selector ":=" expression.
ActualParameters = "(" [expression {"," expression}] ")" .
ProcedureCall = ident selector [ActualParameters].
IfStatement = "IF" expression "THEN" StatementSequence
{"ELSIF" expression "THEN" StatementSequence}
["ELSE" StatementSequence] "END".
WhileStatement = "WHILE" expression "DO" StatementSequence "END".
statement = [assignment | ProcedureCall | IfStatement | WhileStatement].
StatementSequence = statement {";" statement}.
IdentList = ident {"," ident}.
ArrayType = "ARRAY" expression "OF" type.
FieldList = [IdentList ":" type].
RecordType = "RECORD" FieldList {";" FieldList} "END".
type = ident | ArrayType | RecordType.
FPSection = ["VAR"] IdentList ":" type.
FormalParameters = "(" [FPSection {";" FPSection}] ")".
ProcedureHeading = "PROCEDURE" ident [FormalParameters].
ProcedureBody = declarations ["BEGIN" StatementSequence] "END" ident.
ProcedureDeclaration = ProcedureHeading ";" ProcedureBody.
declarations = ["CONST" {ident "=" expression ";"}]
["TYPE" {ident "=" type ";"}]
["VAR" {IdentList ":" type ";"}]
{ProcedureDeclaration ";"}.
module = "MODULE" ident ";" declarations
["BEGIN" StatementSequence] "END" ident "." .
Run Code Online (Sandbox Code Playgroud)
是的,你是对的:一个statement可以是一个assignment或ProcedureCall这两者开始的规则ident selector:
assignment = ident selector ":=" expression.
ProcedureCall = ident selector [ActualParameters].
statement = [assignment | ProcedureCall | IfStatement | WhileStatement].
Run Code Online (Sandbox Code Playgroud)
你可以把它LL(1)通过删除assignment和ProcedureCall并改变statement成:
statement
= [ ident selector (":=" expression | [ActualParameters])
| IfStatement
| WhileStatement
]
.
Run Code Online (Sandbox Code Playgroud)
(不确定这是否会影响你的语法中的其他规则,但你希望得到如何使它成为LL(1))