ANTLR4字面的六角字符串包含新线条



我试图解析JTAG的SVF文件,我发现了这个问题:

我必须解析一个可以包含空间和新行的十六进制值,但是我还需要具有数字(没有空格(。

我有行评论,白色空间无关紧要,所以我使用了这些词汇规则:

COMMENT : ('!' | '//') .*? 'n' -> skip ;
WS : [ trn]+ -> skip ;

数字和十六进制定义是:

hexLiteral : HEX | NUM ;
NUM : [0-9]+ ;
HEX : [0-9a-f]+ ;

如果输入在十六进制字符串中没有新线或空间,例如:

hexBlock returns [val: str] : '(' hexLiteral ')' {print($hexLiteral.text)}

通过(0af3)运行。

但是我需要匹配和提取 (0a3f 10 e2)返回 0a3f10e2的字符串。

我的第一个想法是使用:

hexLiteral : (HEX | NUM) hexLiteral? ;

但是块的解析导致mismatched input '10' expecting ')'

您正在尝试使2个相反的事情一起工作:

  1. 您想忽略Whitespaces,我想您用它们用它们的语言分开令牌。
  2. 您也希望在某些令牌中挂空。

,我建议不要试图使您的语法接受各种WS/Digit组合,而是建议以正常数量收集单个零件,然后在解析运行后的语义阶段,而是可以检查您的parse树,并将所有代币放在一起应该建立一个单元。

最新更新