我试图解析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个相反的事情一起工作:
- 您想忽略Whitespaces,我想您用它们用它们的语言分开令牌。
- 您也希望在某些令牌中挂空。
,我建议不要试图使您的语法接受各种WS/Digit组合,而是建议以正常数量收集单个零件,然后在解析运行后的语义阶段,而是可以检查您的parse树,并将所有代币放在一起应该建立一个单元。