2012-02-29 2 views
2

Я использую antlr для анализа и перезаписи SQL-запроса.Как определить незанятые ключевые слова с antlr

у меня есть:

select : SELECT ; 

fragment S : 's' | 'S' ; 
.... 
fragment LETTER : 'a'..'z' | 'A'..'Z' ; 

SELECT : S E L E C T ; 

IDENTIFIER : LETTER+ ; 

определить зарезервированные ключевые слова, и пусть они быть не чувствительны к регистру.

Мой вопрос в том, как я могу определить не зарезервированные ключевые слова?

+0

Что такое зарезервированное ключевое слово? Я думал, что вы имели в виду IDENTIFIER, но у вас уже есть такое правило ... –

+0

Belowe - это то, что я нашел на http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt – safarisoul

+0

< зарезервированное слово> :: = ABSOLUTE | ДЕЙСТВИЯ | ACTOR | ДОБАВИТЬ | ПОСЛЕ | ALIAS | ВСЕ | ALLOCATE | ALTER <зарезервированное слово> :: = ADA | C | CATALOG_NAME | ЦЕПЬ | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME – safarisoul

ответ

2

Ваша проблема кажется похожей на проблему, возникшую при создании анализатора для языка Drools (www.jboss.org/drools) (DRL). Например, в DRL «правило» является ключевым словом, но также может использоваться java-программистом как имя свойства в его POJO. Поэтому мы не можем иметь это как зарезервированное ключевое слово.

rule /*keyword*/ "my rule" 
when 
    SomeClass(rule /*property name*/ == "foo") 
... 

Мы назвали эти ключевые слова «мягкими словами».

Для этого в ANTLR, мы определили только «истинный»/«ложный»/«нуль» в качестве ключевых слов в жестких лексере:

https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/main/resources/org/drools/lang/DRLLexer.g#L132

Все остальное является ID. Тогда в PARSER мы использовали семантические предикаты для каждого мягкого ключевого слова:

https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/main/resources/org/drools/lang/DRLExpressions.g#L597

Это позволяет легко интегрировать с Java POJO, созданный без конфликтующих имен свойств и другие вещи с Drools определенных ключевых слов.

Надеюсь, это поможет.

+0

Данные ссылки сломаны :(Возможно, ссылки должны быть изменены на DRL5Lexer.g/DRL5Expressions.g или DRL6Lexer.g/DRL6Expressions.g? –

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