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的新手,所以这一切都有点混乱,我不知道如何正确处理它。