2016-09-22 2 views
1

У меня есть некоторые данные, которые необходимо проанализировать. Я использую ANTLR4 инструмент для автоматической генерации Java парсеров и лексических, что я могу использовать для формирования структурированных данных из входных данных, приведенные ниже Грамматика:ANTLR4 грамматика не ведет себя так, как ожидалось

grammar SUBDATA; 
subdata: 
    data+; 
data: 
    array; 
array: 
    '[' obj (',' obj)* ']'; 
intarray: 
    '[' number (',' number)* ']'; 
number: 
    INT; 
obj: 
    '{' pair (',' pair)* '}'; 
pair: 
    key '=' value; 
key: 
    WORD; 
value: 
    INT | WORD | intarray; 
WORD: 
    [A-Za-z0-9]+; 
INT: 
    [0-9]+; 
WS: 
    [ \t\n\r]+ -> skip; 

испытаний Входные данные:

[ 
    {OmedaDemographicType=1, OmedaDemographicId=100, OmedaDemographicValue=4}, 
    {OmedaDemographicType=1, OmedaDemographicId=101, OmedaDemographicValue=26}, 
    { 
     OmedaDemographicType=2, OmedaDemographicId=102, OmedaDemographicValue=[16,34] 
    } 
] 

Ouput :

line 5:79 mismatched input '16' expecting INT 
line 5:82 mismatched input '34' expecting INT 

GUI Tree O/P

Parser не работает, хотя у меня есть целочисленное значение в указанной выше ожидаемой позиции.

ответ

2

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

В вашем случае, INT будет никогда быть в состоянии соответствовать, так как WORD правило может соответствовать все, INT правило может, и это определено в грамматике. Эти 16 и 32 из примера: WORD s.

Вы должны удалить двусмысленность, не позволяя ни слова начинаться с цифры:

WORD: 
    [A-Za-z] [A-Za-z0-9]*; 
INT: 
    [0-9]+; 

Или поменять местами порядок правил:

INT: 
    [0-9]+; 
WORD: 
    [A-Za-z0-9]+; 

В этом случае, вы можете» t есть слова, которые являются полностью числовыми, но они все равно смогут начать с числа.

+0

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

+0

В дополнение к ответу Лукаса: если вы видите, что неожиданное поведение при разборе всегда начинает их решать, глядя на токены, созданные лексером , Это показало бы вам, что последовательность токенов отличается от ожидаемой. –

Смежные вопросы