我正在为脚本语言编写解析器,并使用antlr 4.5.3。
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语句。 (我的concat语句是一个变量,后跟另一个变量,如var = var1 var2
)我理解antlr正在跳过所有新行,而不是行继续,但我想添加条件,如果之间有一个新行两个exp
,它会将它们视为两个独立的块而不是concat语句。即。
var = var2
functioncall(var)
这些应该是两个单独的块而不是concat语句。 有没有办法做到这一点?
答案 0 :(得分:0)
以下规则适合您吗?
block
: var '=' exp NEW_LINE
| functioncall NEW_LINE
;
NEW_LINE: '\r'? '\n'
WS
: [ \t]+ -> skip
;
在另一种情况下,你应该使用Semantic Predicates或非常不清楚的语法。