Regex ANTLR4仅跳过空行
我正在使用antlr4解析一个文本文件,我是新手。以下是文件的一部分:Regex ANTLR4仅跳过空行,regex,antlr,antlr4,Regex,Antlr,Antlr4,我正在使用antlr4解析一个文本文件,我是新手。以下是文件的一部分: abcdef //emptyline abcdef 在文件流字符串中,它将如下所示: abcdef\r\n\r\nabcdef\r\n 就ANTLR4而言,它提供了“跳过”方法,在解析时通过正则表达式跳过空白、制表符和新行符号等内容。i、 e WS : [\t\s\r\n]+ -> skip ; // skip spaces, tabs, newlines 我的问题是我只想跳过空行。我不想跳过每一个“\r\n”。
abcdef
//emptyline
abcdef
在文件流字符串中,它将如下所示:
abcdef\r\n\r\nabcdef\r\n
就ANTLR4而言,它提供了“跳过”方法,在解析时通过正则表达式跳过空白、制表符和新行符号等内容。i、 e
WS : [\t\s\r\n]+ -> skip ; // skip spaces, tabs, newlines
我的问题是我只想跳过空行。我不想跳过每一个“\r\n”。因此,这意味着当两个或多个“\r\n”同时出现时,我只想跳过第二个或后面的一个。我应该如何编写正则表达式?多谢各位
grammar INIGrammar_1;
init: (section|NEWLINE)+ ;
section: '[' phase_name ':' v ']' (contents)+
| '[' phase_name ']' (contents)+ ;
//
//
phase_name : STRING
|MTT
|MPI_GET
|MPI_INSTALL
|MPI_DETAILS
|TEST_GET
|TEST_BUILD
|TEST_RUN
|REPORTER
;
v : STRING ;
contents: kvpairs
| include_section_pairs
| if_statement
| NEWLINE
| EOT
;
keylhs : STRING
;
valuerhs : STRING
|multiline_valuerhs
|kvpairs
|url
;
kvpairs: keylhs '=' valuerhs NEWLINE
;
include_section_pairs: INCLUDE_SECTION '=' STRING
;
if_statement: IF if_statement_condition THEN NEWLINE (ELSEIF if_statement_condition THEN NEWLINE)*? STRING NEWLINE IFEND NEWLINE
;
if_statement_condition:STRING '=' STRING ';'//here, semicolon has problem, either I use ';' or SEMICOLON
;
multiline_valuerhs:STRING (',' (' ')*? ( '\\' (' ')*? NEWLINE)? STRING)+
;
url:(' ')*?'http'':''//''www.';//ignore this, not finished.
IF: 'if';
ELSEIF:'elif';
IFEND:'fi';
THEN: 'then';
SEMICOLON: ';';
STRING : [a-z|A-Z|0-9|''| |.|\-|_|(|)|#|&|""|/|@|<|>|$]+ ;
//Keywords
MTT: 'MTT';
MPI_GET: 'MPI get';
MPI_INSTALL:'MPI install';
MPI_DETAILS:'MPI Details';
TEST_GET:'Test get';
TEST_BUILD: 'Test build';
TEST_RUN: 'Test run';
REPORTER: 'Reporter';
INCLUDE_SECTION: 'include_section';
//INCLUDE_SECTION_VALUE:STRING;
EOT:'EOT';
NEWLINE: ('\r' ? '\n')+ ;
WS : [\t]+ -> skip ; // skip spaces, tabs, newlines
COMMENT: '#' .*? '\r'?'\n' -> skip;
EMPTYLINE: '\r\n' -> skip;
还有一件小事是,似乎“;”在结果中不能表示为它本身。ANTLR4只是不断地说它需要其他东西,并将分号视为未知符号。您的问题的简短答案是,空格对解析器来说并不重要,所以在lexer中跳过它 较长的答案是认识到跳过空白(或任何其他字符序列)并不意味着它在lexer中不重要。这意味着没有相应的令牌生成供解析器使用。因此,跳过的空格仍将作为生成令牌的分隔符 另外两个观察结果:
我遇到了同样的问题,试图有一种语言,不需要一个;命令分隔符。 对我来说,解决这个问题的方法是将新行添加为一个有效的解析规则,它什么也不做。 我不是这方面的专家,但它奏效了:
nl : NEWLINE{};
新行如下所示(无跳过)
我猜在你的语法中,换行符标志着一个结构的结束。为什么不允许在解析器级别使用空构造函数呢?或者,如果你有一个换行符,你可以考虑换行是真的矿石或更多的新线,例如<代码> nL:[\r\n+];<代码>-这更简单。@Lucastrezesniewski感谢您的评论。实际上,我正试图解析一个INI文件,它使用“\r\n”(在Windows中)作为行分隔符,就像JAVA中的分号一样。对于您提到的新换行标记--NL:[\r\n]+;这是我使用的第一种可选方式。它在树节点中显示了所有“\r\n”符号,这很好。但是,目前该要求已更改为仅跳过这些空行。我想知道这样做是否可行。如果不可能,我会报告他们改变要求。嗯。。。我不太明白这怎么不符合你的要求。张贴你的语法,这会使你的问题更清楚。@Lucastrezesniewski谢谢。我张贴了语法。它还没有完成,所以请忽略一些愚蠢的错误。:)
nl : NEWLINE{};
NEWLINE:[\r?\n];