Я пытался проанализировать файл SVF для JTAG и обнаружил эту проблему:
Мне нужно проанализировать шестнадцатеричное значение, которое может содержать пробелы и новые строки, но мне нужно иметь также числа (без пробелов)).
У меня есть строчные комментарии, и пробелы не имеют значения, поэтому я использовал следующие лексические правила:
COMMENT : ('!' | '//') .*? '\n' -> skip ;
WS : [ \t\r\n]+ -> 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 ')'
.