私が持っていたパーサのコードをコンパイルしながら:エラーパーサーのルール
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.
とのために
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 ;
をしかし、私はエラーを得ましたここで
が、私はエラーを取得するクラスASTGenerationのためのコードです:
"(COMMAのEXP)" で*表記を使用してから私を阻止するこの、あるいは "EXP" そのもののようなoverride def visitFuncall(ctx:FuncallContext) = CallExpr(ctx.ID.getText,if (ctx.exp == null) List() else List(visit(ctx.exp).asInstanceOf[Expr]))
これが関与私の字句解析コードである:
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」について思ったんだけど)私のパーサのコードで間違っていたものを私に伝えることができますし、どのように私はそれを修正する必要があります。前もって感謝します!!
私のコードは、あなたのコメントがそれらの間の暗黙的な接続について私に思い出させるので、私のコードをチェックしてもよいと思います。 –