Regex 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”。

我正在使用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”。因此,这意味着当两个或多个“\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中不重要。这意味着没有相应的令牌生成供解析器使用。因此,跳过的空格仍将作为生成令牌的分隔符

另外两个观察结果:

  • Antlr不做regex的工作——沿着这些思路思考将导致进一步的概念上的困难

  • 不要忽略在生成Lexer/Parser时产生的警告和错误消息——它们几乎总是需要更正,然后生成的代码才能正常工作

  • 在尝试调试解析器规则之前,验证lexer是否正在生成您想要的令牌流确实很有帮助。请参阅如何转储令牌流


  • 我遇到了同样的问题,试图有一种语言,不需要一个;命令分隔符。 对我来说,解决这个问题的方法是将新行添加为一个有效的解析规则,它什么也不做。 我不是这方面的专家,但它奏效了:

    nl : NEWLINE{};
    
    新行如下所示(无跳过)


    我猜在你的语法中,换行符标志着一个结构的结束。为什么不允许在解析器级别使用空构造函数呢?或者,如果你有一个换行符,你可以考虑换行是真的矿石或更多的新线,例如<代码> nL:[\r\n+];<代码>-这更简单。@Lucastrezesniewski感谢您的评论。实际上,我正试图解析一个INI文件,它使用“\r\n”(在Windows中)作为行分隔符,就像JAVA中的分号一样。对于您提到的新换行标记--NL:[\r\n]+;这是我使用的第一种可选方式。它在树节点中显示了所有“\r\n”符号,这很好。但是,目前该要求已更改为仅跳过这些空行。我想知道这样做是否可行。如果不可能,我会报告他们改变要求。嗯。。。我不太明白这怎么不符合你的要求。张贴你的语法,这会使你的问题更清楚。@Lucastrezesniewski谢谢。我张贴了语法。它还没有完成,所以请忽略一些愚蠢的错误。:)
    nl : NEWLINE{};
    
    NEWLINE:[\r?\n];