2013-02-12 105 views
3

我正在使用ANTLR 3执行以下操作。ANTLR3:匹配所有内容直到指定的关键字

假设我有一个SQL查询。我知道,通常它是WHERE,ORDER BY和GROUP BY子句是可选的。就ANTLR的语法而言,我会这样描述:

 
query : select_clause from_clause where_clause? group_by_clause? order_by_clause? 

每个子句的规则显然都以各自的关键字开始。

我真正需要的是将每个子句的内容作为一个字符串提取出来,而不涉及其内部结构。

要做到这一点,我开始用下面的语法:

 
query : 
    select_clause from_clause where_clause? group_by_clause? order_by_clause? 
EOF; 

select_clause : 
    SELECT_CLAUSE 
; 

from_clause : 
    FROM_CLAUSE 
; 

where_clause : 
    WHERE_CLAUSE 
; 

group_by_clause : 
    GROUP_BY_CLAUSE 
; 

order_by_clause : 
    ORDER_BY_CLAUSE 
; 

SELECT_CLAUSE : 'select' ANY_CHAR*; 

FROM_CLAUSE : 'from' ANY_CHAR*; 

WHERE_CLAUSE : 'where' ANY_CHAR*; 

GROUP_BY_CLAUSE : 'group by' ANY_CHAR*; 

ORDER_BY_CLAUSE : 'order by' ANY_CHAR*; 

ANY_CHAR : .; 

WS : ' '+ {skip();}; 

这一个没有工作。我已经进一步尝试撰写正确的语法,但没有成功。我怀疑这个任务对ANTLR3是可行的,但我只是缺少水手。

更一般地说,我希望能够将来自输入流的字符收集到单个令牌中,直到遇到指示新令牌开始的特定关键字。该关键字应该是新令牌的一部分。

你能帮助我吗?

回答

2

而不是将它们添加到您的标记,为什么不将ANY_CHAR*转移到解析器规则呢?您甚至可以使用重写规则将这些单个令牌“粘合”在一起。

一个快速演示:

grammar T; 

options { output=AST; } 
tokens { QUERY; ANY; } 

query   : select_clause from_clause where_clause? group_by_clause? order_by_clause? EOF 
        -> ^(QUERY select_clause from_clause where_clause? group_by_clause? order_by_clause?) 
       ; 
select_clause : SELECT_CLAUSE^ any; 
from_clause  : FROM_CLAUSE^ any; 
where_clause : WHERE_CLAUSE^ any; 
group_by_clause : GROUP_BY_CLAUSE^ any; 
order_by_clause : ORDER_BY_CLAUSE^ any; 
any    : ANY_CHAR* -> ANY[$text]; 

SELECT_CLAUSE : 'select'; 
FROM_CLAUSE  : 'from'; 
WHERE_CLAUSE : 'where'; 
GROUP_BY_CLAUSE : 'group' S+ 'by'; 
ORDER_BY_CLAUSE : 'order' S+ 'by'; 
ANY_CHAR  : . ; 
WS    : S+ {skip();}; 

fragment S  : ' ' | '\t' | '\r' | '\n'; 

如果你现在解析输入:

select JUST ABOUT ANYTHING from YOUR BASEMENT order by WHATEVER

以下AST将被创建:

enter image description here

试图做同样的事情在你的词法分析器中会很混乱,并且意味着一些自定义代码(或者谓词)来检查char-stream中的关键字(两者都不太好!)。

+0

谢谢巴特! 这个语法有一些小问题(例如,如果WHERE子句包含'或'运算符),但你给了我一个很好的起点。 因为我还不是很熟悉用ANTLR构建AST,所以我需要花一些时间来充分理解答案。 – preeze 2013-02-17 11:42:41

相关问题