Я бы хотел определить грамматику для простого языка.
Язык допускает какие-то задания.
Пример
keyworda: this is the 1 keyword-A
keywordb: this is the second keywordb
...
Дело в том,что после ключевого слова и ':'
любой символ должен быть возможен (ключевое слово тоже)
Я много чего перепробовал, но думаю, что я все еще не так в мышлении лексера и парсера ...
Моя последняя идея не удалась:
rule
: 'keyworda' ':' anychar* 'keywordb' ':' anychar* EOF
;
anychar
: .
;
NEWLINE
: ('\r'? '\n') {$channel=HIDDEN;}
;
РЕДАКТИРОВАТЬ
Прежде всего: спасибо за ваш ответ!
Я прочитал руководство и посмотрелучебные пособия Скотта Стэнчфилда.
Проблема в том, что я не понимаю "anychar" вещь!
Вы правы, грамматика, которую я постет выше, была неправильной, потому что я спешил.
Лучше попробовать, это впереди.Проблема по-прежнему заключается в том, что токенизатор распознает, например, ключевое слово, например, в определении ala
keyworda : this is keyworda.
keywordb : this is another key!
...
Грамматика:
rule
: KEYA ':' STRING_LITERAL* NEWLINE
keybdefinition*
EOF
;
keybdefinition
: KEYB ':' STRING_LITERAL* NEWLINE
;
KEYA: 'keyworda';
KEYB:'keywordb';
STRING_LITERAL: 'a'..'z' | 'A'..'Z' | '0'..'9' | ':' | '.' | '&' | '/' | '\\' | ';';
NEWLINE: '\r'? | '\n';
SPACE: (' ' | '\t') {$channel=HIDDEN;};
EDIT II
Боже мой, это очевидносделать так, как ты это объяснил.Не знаю, почему я не получил это сам!Большое спасибо Тиму за ваше объяснение!
У меня остался еще один вопрос: если я определю свои токены для лексера и мою грамматику для парсера.Это обычный способ проверки семантики в синтаксическом анализаторе дерева или в самом синтаксическом анализаторе?
Например, давайте предположим, что у меня есть та же самая грамматика, определенная вами, что и вы.
keyworda : ab
keywordb : xy
keyworda : ab1
keywordb : xy1
...
СейчасЯ хочу проверить, если после каждого ключевого слова определено ключевое слово b.Позже я хочу проверить, правильно ли указано значение.Предположим, у нас есть ключевое слово extends: «значение ключа», и мне нужно проверить, определено ли «значение ключа».
Я мог бы сделать это двумя способами: во-первых, изменить правило грамматики для анализатораи добавьте Java-код для проверок прямо здесь.Во-вторых, грамматика остается неизменной, и я определяю грамматику синтаксического анализатора дерева для проверки этих условий.
Я не знаю, какой путь лучше, а какие преимущества или недостатки ...
Большое спасибо за вашу помощь