2012-02-29 6 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

私はhttp://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txtで見つけたものです – safarisoul

+0

<予約語> :: = アブソルート|アクション| ACTOR |追加|アフター| ALIAS |すべて| ALLOCATE | ALTER <予約語> :: = ADA | C | CATALOG_NAME | CHAIN | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME – safarisoul

答えて

2

問題は、Drools(www.jboss.org/drools)言語(DRL)用のパーサを構築するときに遭遇した問題と似ています。たとえば、DRLでは、「ルール」はキーワードですが、POJOのプロパティ名としてJavaプログラマが使用することもできます。だから私たちはそれを予備のキーワードとして持つことはできません。

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

これらのキーワードを「ソフトキーワード」と呼びます。他

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

すべてがIDです:ANTLRで、我々はLEXERハードキーワードとしてのみ "真"/"偽"/"ヌル" が定義されていることを行うには

。パーサーでは、我々は各ソフトキーワードの意味的な述語を使用:これは、ことが可能になり

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

シームレスに統合するためにJavaはDroolsの定義されたキーワードとプロパティ名と他のものを衝突することなく、POJOを作成して。

希望します。

+0

リンクが壊れています:(リンクをDRL5Lexer.g/DRL5Expressions.gまたはDRL6Lexer.g/DRL6Expressions.gに変更する必要がありますか? –

関連する問題