2017-09-08 3 views
-1

私が持っていたパーサのコードをコンパイルしながら:エラーパーサーのルール

funcall: ID LB exp? RB ; 

exp: funcall | INTLIT ; 
その後

私の割り当ては、私が「funcallの」のために、次のように実行する必要があることが必要です。

An invocation expression is a function call which starts with an identifier followed by “(“ and “)”. A nullable comma-separated list of expressions might be appeared between “(“ and “)” as a list of arguments.

とのために

Precedence and Associativity

S: "EXP" は、それが優先順位と結合に従わなければなりませんO Iは、要件(それが割り当てに言及していないので、私は「funcallの」後のリテラルの順序のでわからない)と一致するように、このように私のコードを記述してみました:

funcall: ID LB (exp (COMMA exp)*)? RB ; 

exp 
: LB exp RB 
| LSB exp RSB 
| <assoc=right> (SUB | NOT) exp 
| exp op = (DIV | MUL | MODUL) exp 
| exp op = (ADD | SUB) exp 
| exp op = (LT | LTOE | GT | GTOE) exp 
| exp op = (EQUAL | NOEQUAL) exp 
| exp AND exp 
| exp OR exp 
| <assoc=right> exp ASSIGN exp 
| funcall 
| (INTLIT | FLOATLIT) 
| (TRUE | FALSE) 
| ID 
| STRINGLIT ; 

をしかし、私はエラーを得ましたここで

Compiling Error

が、私はエラーを取得するクラスASTGenerationのためのコードです:

override def visitFuncall(ctx:FuncallContext) = CallExpr(ctx.ID.getText,if (ctx.exp == null) List() else List(visit(ctx.exp).asInstanceOf[Expr]))

"(COMMAのEXP)" で*表記を使用してから私を阻止するこの、あるいは "EXP" そのもののような

これが関与私の字句解析コードである:

LB: '(' ; 

RB: ')' ; 

LP: '{' ; 

RP: '}' ; 

SEMI: ';' ; 

LSB: '[' ; 

RSB: ']' ; 

COMMA: ',' ; 

ADD: '+' ; 

SUB: '-' ; 

MUL: '*' ; 

DIV: '/' ; 

OR: '||' ; 

AND: '&&' ; 

NOT: '!' ; 

NOEQUAL: '!=' ; 

EQUAL: '==' ; 

MODUL: '%' ; 

ASSIGN: '=' ; 

LT: '<' ; 

LTOE: '<=' ; 

GT: '>' ; 

GTOE: '>=' ; 

TRUE: 'true' ; 

FALSE: 'false' ; 

INTLIT: [0-9]+ ; 

FLOATLIT: INTLIT DOT INTLIT ; 
fragment DOT: '.' ; 

ID: [_a-zA-Z] [_a-zA-Z0-9]* ; 

STRINGLIT: '"' ('\\' [bfrnt'"\\] | ~[\b\f\r\n\t'"\\])*; '"' ; 

WS : [ \t\r\n]+ -> skip ; 

を誰でも(「funcallの」でエラーにつながる可能性があり、今私は私の「EXP」について思ったんだけど)私のパーサのコードで間違っていたものを私に伝えることができますし、どのように私はそれを修正する必要があります。前もって感謝します!!

答えて

0

生成されたコードを確認してください。 funcallルール内に複数のexprがあるため、funcallコンテキストクラスのexprメンバは単一ノードではなく、構文解析時にコンテキストが入ってくるときにexprのパースされたノード(コンテキスト)リストです。

+0

私のコードは、あなたのコメントがそれらの間の暗黙的な接続について私に思い出させるので、私のコードをチェックしてもよいと思います。 –