2015-05-04 4 views
2

У меня есть очень простой файл грамматика, которая выглядит следующим образом:Проблем с ANTLR4 грамматикой

grammar Wort; 

// Parser Rules: 
word 
    : ANY_WORD EOF 
    ; 

// Lexer Rules: 
ANY_WORD 
    : SMALL_WORD | CAPITAL_WORD 
    ; 
SMALL_WORD 
    : SMALL_LETTER (SMALL_LETTER)+ 
    ; 
CAPITAL_WORD 
    : CAPITAL_LETTER (SMALL_LETTER)+ 
    ; 
fragment SMALL_LETTER 
    : ('a'..'z') 
    ; 
fragment CAPITAL_LETTER 
    : ('A'..'Z') 
    ; 

Если я пытаюсь разобрать вход «Hello», все в порядке, но если если изменить мой файл грамматики, как это:

... 

// Parser Rules: 
word 
    : CAPITAL_WORD EOF 
    ; 

... 

Ввод «Hello» больше не признается допустимым. Может кто-нибудь объяснить, что происходит не так?

Thanx, Ларс

+0

'ANY_WORD' должно быть правилом анализатора. – Mephy

ответ

1

Проблема здесь связана с старшинства в грамматике лексического анализатора. Потому что ANY_WORD указан перед CAPITAL_WORD, он получает более высокий приоритет. Лексер идентифицирует Hello как CAPITAL_WORD, но так как ANY_WORD может быть только CAPITAL_WORD, а лексер настроен на то, чтобы предпочесть ANY_WORD, он выдает токен ANY_WORD. Парсер действует на выход лексера, а так как ANY_WORDEOF не соответствует ни одному из своих правил, синтаксический анализ не выполняется.

Вы можете сделать лексер вести себя по-разному, перемещая CAPITAL_WORD выше ANY_WORD в грамматике, но это создаст противоположную проблему - с заглавной буквы, слова никогда не закон, как ANY_WORD с. Лучше всего сделать, наверное, то, что предложил Mephy - сделать ANY_WORD правилом анализатора.

+0

Thanx, это мне очень помогает! –

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