2015-09-16 5 views
0

У меня возникла проблема при анализе некоторой команды с синтаксическим анализатором, который я реализовал с использованием ANLTR3. Parser не выполняет синтаксический анализ тех команд, которые содержат «любое слово», которое объявлено как правило lexer в грамматике. Для примера рассмотрим следующую грамматику:Не удалось проанализировать команду с использованием грамматики ANTLR3, если команда имеет то же слово, которое объявлено как правило

show : 
    SHOW TABLES '[' projectName? tableName']' -> ^(SHOW TABLES_ ^(PROJECT_NAME projectName)? ^(DATASET_TABLE tableName)); 

SHOW : S H O W; 

Если я пытаюсь разобрать команду «SHOW TABLES [образец-проекта: SHOW]», а затем синтаксический анализ терпит неудачу для этого command.But, если я изменю SHOW слово, то это работает , SHOW TABLES [образец-проект: SHOW] - это работает.

Я не хочу, чтобы получить имя в виде строки, которая окружена в кавычки ("). Может кто-нибудь предложить решение? Я использую ANTLR3.

Спасибо заранее.

ответ

1

Это типичный эффект использования зарезервированного слова в качестве идентификатора. В ANTLR, когда вы определяете зарезервированное слово, например, ваше правило SHOW, оно будет неявно исключено из правила идентификатора, которое вы могли бы определить после этого правила ключевого слова.

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

tableName: 
    IDENTIFIER 
    | SHOW 
    | <others go here> 
; 

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

  • Нет связанных вопросов^_^