首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自bison的ANTLR语法

来自bison的ANTLR语法
EN

Stack Overflow用户
提问于 2010-03-31 21:21:52
回答 1查看 1.6K关注 0票数 2

我正在试着把一个语法从bison翻译成ANTLR。语法本身在bison中非常简单,但我找不到一种简单的方法来做到这一点。

bison中的语法:

代码语言:javascript
复制
expr = expr or expr | expr and expr | (expr)

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

谢谢,尤利安

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-31 21:44:28

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

代码语言:javascript
复制
a : a b
  ;

尾递归很好:

代码语言:javascript
复制
a : b a
  ;

有关左递归规则的更多信息,请参见ANTLR's Wiki

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

代码语言:javascript
复制
parse
  :  expr+ EOF
  ;

expr
  :  orExpr
  ;

orExpr
  :  andExpr ('or' andExpr)*
  ;

andExpr
  :  atom ('and' atom)*
  ;

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

Boolean
  :  'true'
  |  'false'
  ;

下面是一个用Java编写的小演示:

代码语言:javascript
复制
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();}
  ;

首先创建一个lexer & parser (1),然后编译所有源文件(2)。最后,执行BoolExpParser类(3)。

1

代码语言:javascript
复制
// Windows & *nix/MacOS
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g

2

代码语言:javascript
复制
// Windows
javac -cp .;antlr-3.2.jar *.java

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

3.

代码语言:javascript
复制
// 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 ParrANTLR reference是一本关于ANTLR3的书,Scott在ANTLR3(带有Eclipse)上创建了一些优秀的video tutorials

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2553228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档