antlr4 - конфликтующие правила, как исправить

У меня следующие правила:

property   : NAME;
value      : STRING | NUMBER;

NUMBER     : ('0'..'9')+;
NAME       : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+;
STRING     : '"' (~'"')* '"';

Когда свойство является числом, ANTLR говорит:

line 1:14 mismatched input '5' expecting NAME

Я понимаю, почему так происходит. Правило NUMBER упоминается перед правилом NAME, поэтому оно имеет приоритет. Номер распознается правилом NUMBER.

Как обычно справляются с этим в ANTLR? Я мог бы переписать property правило следующим образом, но я действительно не знаю, хорошая ли это идея, поскольку я ввожу избыточность.

property   : NAME | NUMBER;

Изменение порядка NUMBER и NAME тоже не является хорошей идеей, так как это нарушит правило value для чисел (та же проблема).

Важно отметить: я новичок в ANTLR и все еще учусь.


person Steve Kelio    schedule 01.11.2014    source источник


Ответы (1)


Да, property : NAME | NUMBER; - это способ сделать это.

person Bart Kiers    schedule 01.11.2014
comment
Спасибо! Я должен привыкнуть, что определение избыточных правых сторон (NUMBER - это подмножество NAME) является предпочтительным. - person Steve Kelio; 02.11.2014