parsing - 如何编写处理逗号分隔列表中的内联注释的语法?
问题描述
我正在尝试解析此列表:
[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);
应该做的伎俩(skip
如果你不希望他们在HIDDEN
频道上,你可以肯定)
推荐阅读
- arrays - 从集合视图中的数组中抓取字符串时超出索引范围
- c# - 如何将带有动态查询参数的 PowerBI 报告 url 加载到 mvc 网站中
- c# - 在没有存储过程的情况下从 C# Visual Studio 执行 Alter Tablespace 语句
- git - 在 Windows 上使用 SSH 私钥进行 Git 推送
- python - what's the necessity of "else" in Python exception handling?
- apache-spark-sql - 在 Spark 中创建数据框时遇到问题
- ionic-framework - cordova-plugin-antplus 不适用于 ionic 3
- c# - 是否可以在 .NET 中开发大型应用程序(企业级)?
- jquery - 使用jquery隐藏首页上的导航栏
- asp.net - Get IP v4 of client client machine asp.net