如何编写处理逗号分隔列表中的内联注释的语法?
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
)
我正在尝试解析此列表:
[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
)