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

什麼是非保留關鍵字?我以爲你的意思是一個標識符,但你已經有這樣的規則... – 2012-02-29 06:13:43

+0

下面是我在http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt找到的 – safarisoul 2012-02-29 06:36:14

+0

<保留字> :: = ABSOLUTE |行動| ACTOR | ADD |後| ALIAS | ALL | ALLOCATE | ALTER <非保留字> :: = ADA | C | CATALOG_NAME | CHAIN | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME – safarisoul 2012-02-29 06:37:19

回答

2

您的問題與構建Drools(www.jboss.org/drools)語言(DRL)解析器時出現的問題類似。例如,在DRL中,「rule」是一個關鍵字,但是也可以被java程序員用作POJO中的屬性名稱。所以我們不能把它作爲保留關鍵字。

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

我們將這些關鍵字稱爲「軟關鍵字」。

做,在ANTLR,我們只定義了 「真」/ 「假」/ 「空」 作爲LEXER硬關鍵字:

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

其他的都是一個ID。然後在解析器中,我們使用語義斷言每個軟關鍵字:

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? – 2013-10-16 22:36:14