-
Notifications
You must be signed in to change notification settings - Fork 0
Parser
Die Grammatik ist wegen mancher linksrekursiver Produktionen für kein k LL(k).
In jedem Fall muss in diesen Produktionen die linksrekursion für den rekursiven Abstieg eliminiert werden (vermutlich auch noch andere Produktionen):
- LogicalOrExpression -> (LogicalOrExpression ||)? LogicalAndExpression
- LogicalAndExpression -> (LogicalAndExpression &&)? EqualityExpression
- EqualityExpression -> (EqualityExpression (== | !=))? RelationalExpression
- RelationalExpression -> (RelationalExpression (< | <= | > | >=))? AdditiveExpression
- AdditiveExpression -> (AdditiveExpression (+ | -))? MultiplicativeExpression
- MultiplicativeExpression -> (MultiplicativeExpression (* | / | %))? UnaryExpression
LogicalOrExpression :
- LogicalOrExpression -> LogicalAndExpression LogicalOrExpression'
- LogicalOrExpression' -> (|| LogicalAndExpression LogicalOrExpression')?
LogicalAndExpression:
- LogicalAndExpression -> EqualityExpression LogicalAndExpression'
- LogicalAndExpression' -> (&& EqualityExpression LogicalAndExpression')?
EqualityExpression:
- EqualityExpression -> RelationalExpression EqualityExpression'
- EqualityExpression' -> ((== | !=) RelationalExpression EqualityExpression')?
RelationalExpression:
- RelationalExpression -> AdditiveExpression RelationalExpression'
- RelationalExpression' -> ((< | <= | > | >=) AdditiveExpression RelationalExpression')?
AdditiveExpression:
- AdditiveExpression -> MultiplicativeExpression AdditiveExpression'
- AdditiveExpression' -> ((+ | -) MultiplicativeExpression AdditiveExpression')?
MultiplicativeExpression:
- MultiplicativeExpression -> UnaryExpression MultiplicativeExpression'
- MultiplicativeExpression' -> ((* | / | %) UnaryExpression MultiplicativeExpression')?
Um von SLL(3) zu SLL(2) zu kommen. Weniger sollte nicht gehen, da BasicType auch IDENT sein kann in NewExpression
:
PrimaryExpression -> null | false | true | INTEGER_LITERAL | PrimaryIdent | this | ( Expression ) | new NewExpression
PrimaryIdent -> IDENT | IDENT ( Arguments )
NewExpression -> IDENT () | BasicType NewArrayExpression
NewArrayExpression -> [Expression] ([])*
PostfixOp -> MethodInvocationFieldAccess | ArrayAccess
MethodInvocationFieldAccess -> . IDENT MethodInvocationFieldAccess'
MethodInvocationFieldAccess' -> ( Arguments ) | epsilon
Ich denke eine Gegenüberstellung von Produktionen, wie sie im Sprachbericht aufgeführt werden und den Produktionen, wie wir sie im Parser modofiziert implementieren, ist sinnvoll.
parseProgram:
Program -> ClassDeclaration*
ClassDeclaration -> class IDENT { ClassMember' }
parseClassMember:
ClassMember -> Field | Method | MainMethod
Field -> public Type IDENT ;
MainMethod -> public static void IDENT ( String [ ] IDENT ) Block
Method -> public Type IDENT ( Parameters? ) Block
parseParameters:
Parameters -> Parameter (, Parameters)?
parseParameter:
Parameter -> Type IDENT
parseType:
Type -> Basictype ([])?
BasicType -> int | boolean | void | IDENT
parseStatement:
TODO: currently under revision
parseBlock:
Block -> { BlockStatement* }
parseBlockStatement:
parseBlockStatement -> Block | EmptyStatement | IfStatement | ExpressionStatement | WhileStatement | ReturnStatement | LocalVariableDeclarationStatement
parseLocalVariableDeclarationStatement:
LocalVariableDeclarationStatement -> Type IDENT (= Expression)? ;
parseEmptyStatement:
EmptyStatement -> ;
parseWhileStatement:
WhileStatement-> while ( Expression ) Statement
parseIfStatement:
IfStatement -> if ( Expression ) Statement (else Statement)?
parseExpressionStatement:
ExpressionStatement -> Expression ;
parseReturnStatement:
ReturnStatement -> return Expression? ;