Где синтаксис Оберона не LL (1)? - PullRequest
       29

Где синтаксис Оберона не LL (1)?

0 голосов
/ 06 сентября 2011

7,2. Где синтаксис Оберона, а не LL (1), то есть где заглядывает более одного символа необходимо? Измените синтаксис таким образом, чтобы он удовлетворял свойству 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 Ответ

5 голосов
/ 06 сентября 2011

Да, вы правы: statement может быть assignment или ProcedureCall, оба из которых начинаются с правил ident selector:

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

Вы можете сделать это LL(1) удалив assignment и ProcedureCall и изменив statement на:

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

(не уверен, повлияет ли это на другие правила в вашей грамматике, но, надеюсь, вы поймете, как это сделатьэто LL (1))

...