我正在使用antlr來分析和重新編寫sql查詢。如何使用antlr定義非保留關鍵字
我:
select : SELECT ;
fragment S : 's' | 'S' ;
....
fragment LETTER : 'a'..'z' | 'A'..'Z' ;
SELECT : S E L E C T ;
IDENTIFIER : LETTER+ ;
定義保留關鍵字,讓他們不區分大小寫。
我的問題是如何定義非保留關鍵字?
我正在使用antlr來分析和重新編寫sql查詢。如何使用antlr定義非保留關鍵字
我:
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中,「rule」是一個關鍵字,但是也可以被java程序員用作POJO中的屬性名稱。所以我們不能把它作爲保留關鍵字。
rule /*keyword*/ "my rule"
when
SomeClass(rule /*property name*/ == "foo")
...
我們將這些關鍵字稱爲「軟關鍵字」。
做,在ANTLR,我們只定義了 「真」/ 「假」/ 「空」 作爲LEXER硬關鍵字:
其他的都是一個ID。然後在解析器中,我們使用語義斷言每個軟關鍵字:
這使得能夠無縫集成與Java創建的POJO沒有衝突與Drools的定義的關鍵字屬性名稱和其他東西。
希望它有幫助。
給定的鏈接是壞的:(也許鏈接應改爲DRL5Lexer.g/DRL5Expressions.g或DRL6Lexer.g/DRL6Expressions.g? – 2013-10-16 22:36:14
什麼是非保留關鍵字?我以爲你的意思是一個標識符,但你已經有這樣的規則... – 2012-02-29 06:13:43
下面是我在http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt找到的 – safarisoul 2012-02-29 06:36:14
<保留字> :: = 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