Parsing 如何编写处理逗号分隔列表中的内联注释的语法?

Parsing 如何编写处理逗号分隔列表中的内联注释的语法?,parsing,antlr,antlr4,grammar,Parsing,Antlr,Antlr4,Grammar,我正在尝试分析此列表: [Params] Param1 = 0, $ reserved, shall equal 0 ,, $ Link Path Size, Link Path 0x0000, $ Descriptor 0xC4,

我正在尝试分析此列表:

[Params]
        Param1 =
                0,                      $ reserved, shall equal 0
                ,,                      $ Link Path Size, Link Path
                0x0000,                 $ Descriptor
                0xC4,                   $ Data Type
                4,                      $ Data Size in bytes
                "posX",                 $ name
                "mm",                   $ units
                "X coordinate of current position",    $ help string
                ,,0,                    $ min, max, default data values
                ,,,,                    $ mult, div, base, offset scaling
                ,,,,                    $ mult, div, base, offset links
                ;                       $ decimal places
据我所知,评论只能在一行的末尾。但是这里的评论在列表的中间。因为列表可以跨越多行。还要注意,该列表可以有空值

以下是我目前的语法:

grammar test;

eds                 :   section+;

section             :   header HEADER_DECl_END body;

header              :   '[' name ']';

body                :   field+;

field               :   name '=' value STMTEND;

name                :   Identifier;

raw_value           :   string
                    |   integer
                    |   hex
                    |   version
                    |   date
                    |   time;

value               :   raw_value
                    |   list;

list                :   raw_value list_value+;

list_value          :   ',' raw_value
                    |   ',';

string              :   String_standard
                    |   string_list;

string_list         :   String_standard string_list
                    |   String_standard String_standard;

integer             :   Integer;
version             :   Version;
date                :   Date;
time                :   Time;
hex                 :   Hex;

String_standard     :   '"' ( Escape | ~('\'' | '\\' | '\n' | '\r') | '.' | '+' + '/' | ' ') + '"';
 
Escape              :   '\\' ( '\'' | '\\' );

Integer             :   NUMBER+;

Hex                 :   '0' 'x' HEX_DIGIT+;

Version             :   NUMBER+ '.' NUMBER+
                    |   NUMBER+ '.' NUMBER+ '.' NUMBER+
                    |   NUMBER+ '.' NUMBER+ '.' NUMBER+ '.' NUMBER+;

Date                :   NUMBER NUMBER '-' NUMBER NUMBER '-' NUMBER NUMBER NUMBER NUMBER;

Time                :   NUMBER NUMBER ':' NUMBER NUMBER ':' NUMBER NUMBER;

Identifier          :   Identifier_Char+;

fragment 
Identifier_Char     :   LETTER
                    |   NUMBER
                    |   '_';


fragment LETTER              :   [a-zA-Z];

fragment HEX_DIGIT           :   [a-fA-F0-9];

fragment NUMBER              :   [0-9];

STMTEND             :   SEMICOLON NEWLINE+;
HEADER_DECl_END     :   NEWLINE;

fragment SEMICOLON : ';';
fragment NEWLINE   : '\r' '\n' | '\n' | '\r';

WS                  : [ \t\r\n]+ -> skip ;
COMMENT             : '$' .*? NEWLINE? -> skip;
当我用它解析时,虽然它无法解析整个列表。并在第一条注释处终止列表。如果我删除了注释,我的语法就正常了。所以它在这个输入上起作用:

[Params]
        Param1 =
                0,                      
                ,,                      
                0x0000,                 
                0xC4,                   
                4,                     
                "posX",              
                "mm",                
                "X coordinate of current position",  
                ,,0,                   
                ,,,,                   
                ,,,,                  
                ;            

我需要做什么来处理注释?

以下是Java的注释规则:

WS:                 [ \t\r\n\u000C]+ -> channel(HIDDEN);
COMMENT:            '/*' .*? '*/'    -> channel(HIDDEN);
LINE_COMMENT:       '//' ~[\r\n]*    -> channel(HIDDEN);
您没有内联注释,因此类似于:

WS:                 [ \t\r\n\u000C]+ -> channel(HIDDEN);
LINE_COMMENT:       '$' ~[\r\n]*    -> channel(HIDDEN);

应该这样做(如果你不想让它们出现在
隐藏的
频道上,你肯定可以
跳过

我发现你的空白处理令人困惑。你们都会忽略换行符,并将它们识别为标记的一部分。例如,如果分号和换行符之间有空格(或注释),我认为
STMTEND
将无法匹配。我认为这不是你的问题,因为你说你的解析在分号到达之前就失败了。但这可能是你想要解决的问题。好的,谢谢!是的,我不太确定如何处理这个问题,因为有时候空白看起来很重要,但有时候不是。我是antlr的新手,所以这一切都有点混乱,我不知道如何正确处理它。