2011-09-06 115 views
-2

7.2。 Oberon语法不是LL(1),哪里是多个符号 的前瞻所在?以这样的方式改变语法,它满足LL(1)物业 这里是奥伯伦语法:Oberon语法不是LL(1)在哪里?

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 "." . 
+1

这是由任何机会作业? – Lucero

+1

我通常不会在我知道答案的地方提问,但是:这是作业吗? –

+0

不,它只是下载关于编译器的书,我正在尝试阅读它。 – GEP

回答

5

是的,你是对的:一个statement可以是assignment或两者的ProcedureCall开始规则ident selector

assignment = ident selector ":=" expression. 
ProcedureCall = ident selector [ActualParameters]. 
statement = [assignment | ProcedureCall | IfStatement | WhileStatement]. 

你可以把它LL(1)通过去除assignmentProcedureCall,改变statement到:

statement 
= [ ident selector (":=" expression | [ActualParameters]) 
    | IfStatement 
    | WhileStatement 
    ] 
. 

(不知道这是否会影响你的语法中的其他规则,但你希望知道如何使LL(1))