除了一点之外,Antlr4完全忽略了换行符

时间:2016-07-25 22:01:09

标签: antlr antlr4

我正在为脚本语言编写解析器,并使用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语句。 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

以下规则适合您吗?

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

NEW_LINE: '\r'? '\n'

WS  
    : [ \t]+ -> skip
    ;

在另一种情况下,你应该使用Semantic Predicates或非常不清楚的语法。