繁体   English   中英

如何在ANTLR 3树解析器中表达多个节点

[英]How to express multiple nodes in an ANTLR 3 tree parser

更新:有什么方法可以在语法分析器中重用该规则? 也许我对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的2个节点,例如a = 1 and b = 2但不支持a = 1 and b = 2 and c = 3

看起来^(OR first=andExp other=andExp*)不正确,但是我不知道如何修改它。 由于我是ANTLR的新手,因此我检查了很多示例来完成我的树解析器,但是仍然不知道如何在ANTLR树解析器中表达多个节点。 有人可以帮我解决这个问题吗? 任何意见表示赞赏。

我的词法分析器和解析器可以在以下URL中找到。

antlr3的简单条件表达式解析器

这是我的树解析器:

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; }
  ;

听起来您好像不了解所创建树的结构。 我建议在树上打印toStringList()以显示结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM