【发布时间】:2014-05-22 11:38:49
【问题描述】:
我是 ANTLR 的新手,我正在尝试使用 ANTLRv4 为 DXF files 编写解析器。 DXF 文件使用所谓的组码来指定以下数据的类型。
一些 DXF 文件的示例摘录:
0
SECTION
2
HEADER
9
$ORTHOMODE
70
0
9
0
ENDSEC
例如,第一个0 表示在下一行中跟随一个字符串。组码70 表示后面将跟随一个 16 位整数,在示例中为0。
我现在的问题是例如如何区分组码0和整数0。
在示例 sn-p 中,整数值似乎有一些特殊的缩进,但我在 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] ;
但显然,在尝试解析整数 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 ;
【问题讨论】: