来自野牛的 ANTLR 语法

编程入门 行业动态 更新时间:2024-10-27 13:31:18
本文介绍了来自野牛的 ANTLR 语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

限时送ChatGPT账号..

我正在尝试将一个语法从 bison 翻译成 ANTLR.野牛的语法本身非常简单,但我找不到这样做的简单方法.

I'm trying to translate a grammar from bison to ANTLR. The grammar itself is pretty simple in bison but I cannot find a simple way for doing this.

bison 中的语法:

Grammar in bison:

expr = expr or expr | expr and expr | (expr)

欢迎任何提示/链接/指针.

Any hints/links/pointers are welcome.

谢谢,尤利安

推荐答案

在 ANTLR 中,您不能创建左递归规则:

In ANTLR, you cannot create left recursive rules:

a : a b
  ;

尾递归很好:

a : b a
  ;

有关左递归规则的更多信息,请参阅 ANTLR 的 Wiki.

For more information on left recursive rules, see ANTLR's Wiki.

因此,您的示例可能如下所示:

So, your example could look like:

parse
  :  expr+ EOF
  ;

expr
  :  orExpr
  ;

orExpr
  :  andExpr ('or' andExpr)*
  ;

andExpr
  :  atom ('and' atom)*
  ;

atom
  :  Boolean
  |  '(' expr ')'
  ;

Boolean
  :  'true'
  |  'false'
  ;

这是 Java 中的一个小演示:

Here's a small demo in Java:

grammar BoolExp;

@members {
  public static void main(String[] args) throws Exception {
    if(args.length != 1) {
      System.out.println("Usage:");
      System.out.println(" - Windows    : java -cp .:antlr-3.2.jar BoolExpParser \"EXPRESSION\"");
      System.out.println(" - *nix/MacOS : java -cp .;antlr-3.2.jar BoolExpParser \"EXPRESSION\"");
      System.exit(0);
    }
    ANTLRStringStream in = new ANTLRStringStream(args[0]);
    BoolExpLexer lexer = new BoolExpLexer(in);
    CommonTokenStream tokens = new CommonTokenStream(lexer);
    BoolExpParser parser = new BoolExpParser(tokens);
    parser.parse();
  }
}

parse
  :  e=expr EOF {System.out.println($e.bool);}
  ;

expr returns [boolean bool]
  :  e=orExpr {$bool = $e.bool;}
  ;

orExpr returns [boolean bool]
  :  e1=andExpr       {$bool = $e1.bool;} 
     ('or' e2=andExpr {$bool = $bool || $e2.bool;}
     )*
  ;

andExpr returns [boolean bool]
  :  e1=atom        {$bool = $e1.bool;} 
     ('and' e2=atom {$bool = $bool && $e2.bool;}
     )*
  ;

atom returns [boolean bool]
  :  b=Boolean      {$bool = new Boolean($b.text).booleanValue();}
  |  '(' e=expr ')' {$bool = $e.bool;}
  ;

Boolean
  :  'true'
  |  'false'
  ;

Space
  :  (' ' | '\t' | '\n' | '\r') {skip();}
  ;

首先创建一个词法分析器 &解析器 (1) 然后编译所有源文件 (2).最后,执行BoolExpParser类(3).

First create a lexer & parser (1) and then compile all source files (2). Finally, execute the BoolExpParser class (3).

// Windows & *nix/MacOS
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g

2

// Windows
javac -cp .;antlr-3.2.jar *.java

// *nix/MacOS
javac -cp .:antlr-3.2.jar *.java

3

// Windows
java -cp .;antlr-3.2.jar BoolExpParser "false and true or true"

// *nix/MacOS
java -cp .:antlr-3.2.jar BoolExpParser "false and true or true"

Terence Parr 的 ANTLR 参考资料 是关于 ANTLR 的.Scott 创造了一些优秀的 关于 ANTLR 3(使用 Eclipse)的视频教程.

Terence Parr's ANTLR reference is the book on ANTLR. And Scott created some excellent video tutorials on ANTLR 3 (with Eclipse).

这篇关于来自野牛的 ANTLR 语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

更多推荐

[db:关键词]

本文发布于:2023-04-20 08:01:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/979033.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:野牛   语法   ANTLR

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!