ANTLR4 Литерал для строки HEX, содержащей новую строку - PullRequest
0 голосов
/ 21 мая 2019

Я пытался проанализировать файл 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 ')'.

1 Ответ

0 голосов
/ 21 мая 2019

Вы пытаетесь создать две противоположные вещи для совместной работы:

  1. Вы хотите игнорировать пробелы, и я думаю, что вы используете их для разделения токенов на вашем языке.
  2. Вы хотитепробелы в некоторых из ваших токенов тоже.

Вместо того, чтобы пытаться заставить вашу грамматику принимать все виды комбинаций ws / digit, я рекомендую собирать отдельные части как нормальные числа, а затем в семантической фазе послеparse run, вы можете проверить ваше дерево разбора и собрать все жетоны, которые должны составить единое целое.

...