Skip to content
esonetec edited this page Nov 4, 2014 · 33 revisions

Grammatik

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')?

Geänderte Produktionen (work in progress)

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

parse-Funktionen (wip)

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? ;
Clone this wiki locally