更新:有没有办法在解析器语法中重用规则?也许我对 ANTLR 树解析器的理解不正确。我认为 ANTLR 树解析器是另一种解析器。我仍然需要创建正确的规则来满足我的要求。如果是这样,AST的提议是什么?我已经生成了正确的 AST 结构,但在树解析器中似乎没用。
为什么
^(OR first=andExp other=andExp*)
不能
andExp ( OR^ andExp)*
在树解析器中写入?我想我没有得到编写树解析器的关键点。
我想用 Antlr3 编写一个 SQL 风格的标准表达式解析器。它需要像这样的支持
a = 1 and b = 2 and c = 3
我已经完成了 Lexer 和 Parser,但是当我根据 AST 创建 Tree Parser 时遇到了问题。
目前只支持 express like 的 2 个节点a = 1 and b = 2
但不支持a = 1 and b = 2 and c = 3
看起来^(OR first=andExp other=andExp*)
不正确,但我不知道如何修改它。由于我是 ANTLR 的新手,所以我检查了很多示例来完成我的树解析器,但仍然不知道如何在 ANTLR 树解析器中表达多个节点。有人可以帮我解决吗?任何意见表示赞赏。
我的词法分析器和解析器可以在以下 URL 中找到。
这是我的树解析器:
tree grammar CriteriaExpressionEval;
options {
language = Java;
tokenVocab = CriteriaExpression;
ASTLabelType = CommonTree;
}
@header {package com.antlr;}
eval
:
expression
;
expression returns[String expStr]
: ^(OR first=andExp other=andExp*)
{
$expStr = $first.addExpStr + " " + $OR.text + " " + $other.addExpStr;
System.out.println("expression -- ^(OR first=andExp other=andExp*) [" + $expStr + "]");
}
|andExp
{
$expStr = $andExp.addExpStr;
System.out.println("expression -- andExp [" + $expStr + "]");
}
;
andExp returns[String addExpStr]
: ^(AND left=subcond right=subcond*)
{
$addExpStr = $left.subCondStr + " " + $AND + " " + $right.subCondStr;
System.out.println("andExp -- ^(AND left=subcond right=subcond*) [" + $addExpStr + "]");
}
|subcond
{
$addExpStr = $subcond.subCondStr;
System.out.println("andExp -- subcond [" + $addExpStr + "]");
}
;
subcond returns[String subCondStr]
: LPAREN expression RPAREN
{
$subCondStr = "(" + $expression.expStr + ")";
System.out.println("subcond -- LPAREN expression RPAREN [" + $subCondStr + "]");
}
|atom
{
$subCondStr = $atom.atomStr;
System.out.println("subcond -- atom [" + $subCondStr + "]");
}
;
atom returns[String atomStr]
:
prop=EXPR OPERATOR val=EXPR { $atomStr = $prop.text + $OPERATOR.text + $val.text; }
;