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是可行的,但我只是缺少水手。
更一般地说,我希望能够将来自输入流的字符收集到单个令牌中,直到遇到指示新令牌开始的特定关键字。该关键字应该是新令牌的一部分。
你能帮助我吗?
谢谢巴特! 这个语法有一些小问题(例如,如果WHERE子句包含'或'运算符),但你给了我一个很好的起点。 因为我还不是很熟悉用ANTLR构建AST,所以我需要花一些时间来充分理解答案。 – preeze 2013-02-17 11:42:41