ANTLR4:[模式]空白需要多个lexer规则吗?

ANTLR4:[模式]空白需要多个lexer规则吗?,antlr,whitespace,token,antlr4,lexical-analysis,Antlr,Whitespace,Token,Antlr4,Lexical Analysis,我正在为输入创建一个解析器,如下所示: FirstName, LastName, Street, City, State, ZipCode Mark,, 4460 Stuart Street, Marion Center, PA, 15759 ---- FirstName=John LastName=Smith -分隔符前面的数据是CSV格式,而-分隔符后面的数据是键/值格式。所以我有两组lexer规则,我使用ANTLR模式在lexer规则之间切换 问题是:我需要一个lexer规则来处理两组l

我正在为输入创建一个解析器,如下所示:

FirstName, LastName, Street, City, State, ZipCode
Mark,, 4460 Stuart Street, Marion Center, PA, 15759
----
FirstName=John
LastName=Smith
-
分隔符前面的数据是CSV格式,而
-
分隔符后面的数据是键/值格式。所以我有两组lexer规则,我使用ANTLR
模式
在lexer规则之间切换

问题是:我需要一个lexer规则来处理两组lexer规则中的空格,而ANTLR不允许在两种模式中使用相同的规则名称。因此,我在一种模式下将其命名为
WS
,在另一种模式下将其命名为
WS2

lexer grammar MyLexer;                  

COMMA  : ',' ;
NL     : ('\r')?'\n' ;
WS     : [ \t\r\n]+ -> skip ;
SEPARATOR : SEP NL -> skip, pushMode(PAIRS) ;
STRING : (~[,\r\n])+ ;

fragment SEP : '----' ;

mode PAIRS ;
KEY       : ('FirstName' | 'LastName') ;
EQ        : '=' ;
NL2       : ('\r')?'\n' ;
WS2       : [ \t\r\n]+ -> skip ;
VALUE     : (~[=\r\n])+ ;
新行同上:
NL
在一种模式下,而
NL2
在另一种模式下


这是可行的,但在美学上并不令人满意。有没有更美观的方法来实现这一点

两项改进建议:

1) 如果您的解析器是无模式的(只需要处理例如NL的-请意识到在这个特定示例中可能不是这种情况)

2) 然后,进行一点清理:

NL  : Nl;
...
NL2 : Nl; 
...
fragment Nl : ('\r')?'\n' -> type(NL); 
总之,这主要是重新安排躺椅,但这是你能做的最多的

NL  : Nl;
...
NL2 : Nl; 
...
fragment Nl : ('\r')?'\n' -> type(NL);