Я использую antlr для анализа и перезаписи SQL-запроса.
У меня есть:
select : SELECT ; fragment S : 's' | 'S' ; .... fragment LETTER : 'a'..'z' | 'A'..'Z' ; SELECT : S E L E C T ; IDENTIFIER : LETTER+ ;
, чтобы определить зарезервированные ключевые слова и позволить им быть без учета регистра.
Мой вопрос: как я могу определить незарезервированные ключевые слова?
Ваша проблема похожа на проблему, с которой мы столкнулись при создании синтаксического анализатора для языка 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.
Надеюсь, это поможет.