我是 ANTLR 的新手,我正在尝试使用 ANTLRv4为DXF 文件编写解析器。DXF 文件使用所谓的组码来指定以下数据的类型。
一些 DXF 文件的示例摘录:
0
SECTION
2
HEADER
9
$ORTHOMODE
70
0
9
0
ENDSEC
例如,第一个0
意味着在下一行中跟随一个字符串。组码70
意味着后面会跟着一个 16Bit Integer,在示例中是0
. 我现在的问题是如何区分组代码0
和 Integer 0
。在示例片段中,整数值似乎有一些特殊的缩进,但我在 DXF 参考中找不到任何关于此的内容。
到目前为止,我的想法是遵循 ANTLR 语法:
grammar SimpleDXF;
start : HEADER variable* ENDSEC ;
variable : varstart (groupcode NL value NL)+ ;
varstart : VAR ;
groupcode : INT ;
value : INT | ANYCHARSEQ ;
WS : [ \t]+ -> skip ;
NL : '\r'? '\n' ;
HEADER : '0' NL 'SECTION' NL '2' NL 'HEADER' NL ;
ENDSEC : '0' NL 'ENDSEC' NL ;
VAR : '9' NL VARNAME NL ;
VARNAME : '$' LETTER (LETTER | DIGIT)* NL ;
INT : DIGIT+ NL ;
ANYCHARSEQ : ANYCHAR+ NL ;
fragment ANYCHAR : [\u0021-\u00FF] ;
fragment LETTER : [A-Za-z_] ;
fragment DIGIT : [0-9] ;
但显然这在尝试解析 Integer 时会失败,因为这被词法分析器0
视为组代码,这是规则的原因。0
header
所以现在我不知道如何解决我的问题。非常感谢任何帮助。
编辑
更改了 ANTLR 语法以包含更多词法分析器规则。现在的问题是词法分析器完全失败了。第一个输入字符是一个INT
标记,而不是我想要的标记的一部分HEADER
......原因是-> skip
如果它在单个标记内,删除空格将不起作用(参见以下示例):
对于输入A B
(两个字母之间的空格),此语法将起作用:
start : 'A' 'B' ;
WS : [ \t\r\n]+ -> skip ;
但是这个语法不起作用:
start : AB ;
AB : 'A' 'B' ;
WS : [ \t\r\n]+ -> skip ;