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つの別々のブロックである必要があります。 これを行う方法はありますか?
私は単なる割り当てと関数呼び出しを使用するとうまく動作します。しかし、もしそれが他のすべての事のために行の継続を破るならば。任意のNEW_LINEをどこにでも追加しなくてもこれを行う方法はありますか? – Crimson7