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

How to write a grammar that handles inline comments in a comma seperated list?

我正在尝试解析此列表:

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

应该可以解决问题(如果您不想让他们出现在 HIDDEN 频道上,您可以 skip