ANTLR4:布尔表达式的解析器



我试图解析以下类型的布尔表达式B1 = p和;(~A5=c)

我想要一个可以用来计算上面表达式的树。所以我在Antlr3中尝试了这个例子,在Antlr解析器和/或逻辑-如何获得逻辑运算符之间的表达式?

它在Antlr3中工作。现在我想对Antlr 4做同样的事情。我打开下面的语法,它可以编译。但是我在写Java代码时遇到了麻烦。

Antlr4语法开始

grammar TestAntlr4;
options {
  output = AST;
}
tokens { AND, OR, NOT }
  AND : '&';
  OR  : '|';
  NOT : '~';

// parser/production rules start with a lower case letter
parse
  :  expression EOF!    // omit the EOF token
  ;
expression
  :  or
  ;
or
  :  and (OR^ and)*    // make `||` the root
  ;
and
  :  not (AND^ not)*      // make `&&` the root
  ;
not
  :  NOT^ atom    // make `~` the root
  |  atom
  ;
atom
  :  ID
  |  '('! expression ')'!    // omit both `(` and `)`
  ;
// lexer/terminal rules start with an upper case letter
ID
  :
    (
    'a'..'z'
    | 'A'..'Z'
    | '0'..'9' | ' '
    | ('+'|'-'|'*'|'/'|'_')
    | '='
  )+ 
  ;

我已经编写了Java代码(下面的代码片段),用于获取表达式"B1=p &A4=p | A6=p &(~A5=c)"我在等&与孩子B1=p和|子运算符|将有子运算符A4=p和A6=p &(~A5=c)。等等......这里是Java代码,但我卡住了,试图弄清楚我将如何得到树。我可以在Antlr 3中做到这一点。

<<h2> Java代码/h2>
String src = "B1=p & A4=p | A6=p &(~A5=c)";
CharStream stream = (CharStream)(new ANTLRInputStream(src));
TestAntlr4Lexer lexer = new TestAntlr4Lexer(stream);
parser.setBuildParseTree(true);
ParserRuleContext tree = parser.parse();
tree.inspect(parser); 
if ( tree.children.size() > 0) {
    System.out.println(" **************");
    test.getChildren(tree, parser);
}

getchildren方法如下。但这似乎没有提取任何令牌。

public void getChildren(ParseTree tree, TestAntlr4Parser parser ) {
   for (int i=0; i<tree.getChildCount(); i++){
       System.out.println(" Child i= " + i);
       System.out.println(" expression = <" + tree.toStringTree(parser) + ">");
       if ( tree.getChild(i).getChildCount() != 0 ) {
           this.getChildren(tree.getChild(i), parser);
       }
   }
}

谁能帮我弄清楚如何在Java中编写解析器?

在ANTLR 4中删除了output=AST选项,以及您在语法中使用的^!操作符。ANTLR 4生成解析树而不是ast,因此由规则生成的树的根是规则本身。例如,给定以下规则:

and : not (AND not)*;

您将得到一个AndContext树,其中分别包含notAND引用的NotContextTerminalNode子节点。为了更容易地处理树,AndContext将包含一个生成的方法not(),该方法返回由not规则调用返回的上下文对象列表(返回类型List<? extends NotContext>)。它还包含一个生成的方法AND,该方法返回为匹配的每个AND令牌创建的TerminalNode实例列表。

相关内容

  • 没有找到相关文章

最新更新