Antlr должен поместить маркер, если значение не указано - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть такая строка для разбора:

*A VE 8507492 8065969 1234 00922 00945                %

Все эти значения являются необязательными. Это моя грамматика для этого:

a_ve:  '*A VE' INT* INT* INT* INT* INT* PROZ;

, где INT это:

INT: [0-9]+ ; and: SPACE: [\r\n ]+ -> skip: 

Поскольку все эти значения являются необязательными, я могу получить такую ​​строку:

*A VE 8507492 8065969 1234         00945                     %

там, где значение 00922 отсутствует. Но в моем абстрактном дереве разбора ничего нет для значения 00922. Должно быть что-то, чтобы я мог распознать, что значений не было. Пробелы между всеми значениями (8507492 8065969) следует игнорировать. Что я должен изменить в своей грамматике, чтобы достичь этого?

1 Ответ

0 голосов
/ 01 мая 2018

С синтаксической точки зрения, что отличает значение 00922 в ряду целых чисел? Хорошо, ничего. Парсер (который соответствует синтаксису только определенным правилам) не может знать, что это число имеет для вас особое значение. Это семантическая проблема, которую вы должны решить после разбора. Все правило должно быть просто:

a_ve: '*A VE' INT* PROZ;

Затем в вашем дереве разбора (примечание: такого понятия, как abstract дерево разбора) не существует, вы можете проверить входящие номера и действовать на них. То, что вы считаете отсутствующим или нет, зависит от вас.

...