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);