2016-07-25 6 views
0

私はスクリプト言語用のパーサーを作成しており、目的のためにantlr 4.5.3を使用しています。Antlr4は改行を1つではなく無視します

grammar VSE; 

chunk 
    : block* EOF 
    ; 

block 
    : var '=' exp 
    | functioncall 
    ; 

var 
    : NAME 
    | var '[' exp ']' 
    | var '.' var 
    ; 

exp 
    : number 
    | string 
    | var 
    | functioncall 
    | <assoc=right> exp exp //concat 
    ; 

functioncall 
    : NAME '(' (exp)? (',' exp)* ')' 
    | var '.' functioncall 
    ; 


string 
    : '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"' 
    ; 

NAME 
    : [a-zA-Z_][a-zA-Z_0-9]* 
    ; 

number 
    : INT | HEX | FLOAT 
    ; 

INT 
    : Digit+ 
    ; 

HEX 
    : '0' [xX] [0-9a-fA-F]+ 
    ; 

FLOAT 
    : Digit* '.' Digit+ 
    ; 

Digit 
    : [0-9] 
    ; 

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

しかし、それをテストしている間、私は次の行でいくつかの関数呼び出しに続いてvar = somethingのような変数の割り当ては、連結計算書につながりました。 (私のconcatステートメントは、var = var1 var2のような別の変数です)私はantlrが行継続のためにすべての新しい行をスキップしていることを理解していますが、2つのexpの間に新しい行がある場合、それは、それらをconcatステートメントの代わりに2つの別々のブロックとして扱います。すなわち

var = var2 
functioncall(var) 

これらは、concat文の代わりに2つの別々のブロックである必要があります。 これを行う方法はありますか?

答えて

0

次のルールはあなたに適していますか?あなたがSemantic Predicatesまたは非常に不明瞭な文法を使用する必要があり、別の場合には

block 
    : var '=' exp NEW_LINE 
    | functioncall NEW_LINE 
    ; 

NEW_LINE: '\r'? '\n' 

WS 
    : [ \t]+ -> skip 
    ; 

+0

私は単なる割り当てと関数呼び出しを使用するとうまく動作します。しかし、もしそれが他のすべての事のために行の継続を破るならば。任意のNEW_LINEをどこにでも追加しなくてもこれを行う方法はありますか? – Crimson7

関連する問題