Как определить незарезервированные ключевые слова с помощью antlr - PullRequest
2 голосов
/ 29 февраля 2012

Я использую antlr для анализа и перезаписи SQL-запроса.

У меня есть:

select : SELECT ;

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

SELECT : S E L E C T ;

IDENTIFIER : LETTER+ ;

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

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

1 Ответ

2 голосов
/ 01 марта 2012

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

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

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

Чтобы сделать это в ANTLR, мы определили только "true" / "false" / "null" как жесткие ключевые слова в LEXER:

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

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

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

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

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

...