gpt4 book ai didi

java - 带有 antlr3 的简单条件表达式解析器

转载 作者:行者123 更新时间:2023-11-30 07:18:57 24 4
gpt4 key购买 nike

我想用 antlr3 创建一个简单的条件表达式解析器

更新:单独的 AND OR 表达式规则以支持 AND/OR 不同的层次结构,但有另一个问题: 如果表达式类似于:a = 1 and b = 2 and c = 3 根据当前的实现,树应该如下所示:

       =      =
(a = 1)(b = 2)(c = 3)
But I want to generate it as follows:
= =
(a = 1)(b = 2)
(c = 3)
First "and" should be higher priority than another, because I want to parse all the expression as left exp and right exp.

我想我需要在“子条件”中重写规则 使a = 1 and b = 2 and c = 3 -> (a = 1 and b = 2) and c = 3

但是尝试了很多次都没有运气。有没有人知道如何实现它?谢谢。


我的目标是解析某种 SQL where 子句样式的句子,并构建一个 AST 来遍历。

例如:

    a = 1 and (b = 2 or c = 3)            //This one can parse correctly.
a = 1 and ((b = 2 or c = 3) or d = 4) //This one cannot parse correctly, missing last d = 4 in the tree.
//Tree is not correct.

我当前的语法文件无法解析上述复杂条件。因为我是 antlr 的新手,不确定如何修改我的语法以更正确地实现上述方法。有人可以帮忙吗? !任何建议或意见表示赞赏。

我的语法如下(根据评论更新。警告问题已解决。):

grammar CriteriaExpression;

options {
output = AST;
ASTLabelType = CommonTree;
language = Java;
}

tokens {
AND = 'and';
OR = 'or';
LPAREN = '(';
RPAREN = ')';
}

@lexer::header {
package com.antlr;
}

@parser::header {
package com.antlr;
}

eval
:
expression
;

表达式 : andExp (OR^ andExp)* ;

和Exp : 子条件 (AND^ 子条件)* ;

次条件 : LPAREN 表达式 RPAREN |原子 ;

atom
:
EXPR OPERATOR EXPR
;

OPERATOR
:
'='| '<>'| '!='| '<='| '!>'| '<'| '>='| '!<'| '>'| 'like'
;

EXPR
:
('a'..'z'| 'A'..'Z'| '0'..'9')+
;

WILDCARD
:
'%'
;

WS
:
('\t'| ' '| '\r'| '\n'| '\u000C')*
{$channel = HIDDEN;}
;

((a=1)) ((a=1))

a = 1 和 ((b = 2 或 c = 3) 或 d = 4) a = 1 and ((b = 2 or c = 3) or d = 4)

最佳答案

你语法中的一个缺陷是规则

expression
:
LPAREN* subcond RPAREN* (( AND | OR )^ LPAREN* subcond RPAREN*)
;

由于您可以拥有任意数量的 LPAREN 或 RPAREN,因此无法保证它们是匹配的。我建议使用类似的东西

expression
: subcond (( AND | OR ) subcond)?
| subcond
;

subcond

subcond
: atom (( AND | OR )^ atom)*
| LPAREN expression RPAREN
;

理想情况下,您还应该为 ANDOR 表达式制定单独的规则,以便在您的解析树中具有正确的优先级。

更新:在您更新的语法中,您再次使用 LPAREN*RPAREN*,这不会为您提供正确平衡的树。您需要使用递归为 ((a = 1)) 之类的多个括号建模,就像我在上面的示例中描述的那样。这会给出一棵像

((a = 1))
^---^--- ATOM
^-----^-- Subcond -> Expression
^-------^- Subcond -> Expression

所以树应该是这样的:

Expression "((a = 1))"
^
Subcond "(a = 1)"
^
Expression "(a = 1)"
^
Subcond "a = 1"
^
ATOM "a = 1"

关于java - 带有 antlr3 的简单条件表达式解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14974843/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com