野牛的ANTLR语法

野牛的ANTLR语法,antlr,grammar,bison,Antlr,Grammar,Bison,我想把一个语法从bison翻译成ANTLR。bison的语法本身非常简单,但我找不到一个简单的方法来实现这一点 野牛的语法: expr = expr or expr | expr and expr | (expr) 欢迎提供任何提示/链接/指针 谢谢, Iulian在ANTLR中,不能创建左递归规则: a : a b ; 尾部递归很好: a : b a ; 有关左递归规则的详细信息,请参阅 因此,您的示例可以如下所示: parse : expr+ EOF ; expr

我想把一个语法从bison翻译成ANTLR。bison的语法本身非常简单,但我找不到一个简单的方法来实现这一点

野牛的语法:

expr = expr or expr | expr and expr | (expr)
欢迎提供任何提示/链接/指针

谢谢,
Iulian

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

a : a b
  ;
尾部递归很好:

a : b a
  ;
有关左递归规则的详细信息,请参阅

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

parse
  :  expr+ EOF
  ;

expr
  :  orExpr
  ;

orExpr
  :  andExpr ('or' andExpr)*
  ;

andExpr
  :  atom ('and' atom)*
  ;

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

Boolean
  :  'true'
  |  'false'
  ;
下面是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)。最后,执行
boolexparser
类(3)

1. 2. 3.
这是关于ANTLR的书。并在ANTLR 3(使用Eclipse)上创建了一些优秀的应用程序。

非常感谢-我觉得很不错。你能给我推荐一个链接/一本书,让我能读到更多关于这个的信息吗?编辑:链接很好;再次感谢。我已经更新了我的答案,并添加了维基链接和书籍推荐。很高兴听到它帮助了您。antlr4现在可以处理直接左递归了
// Windows & *nix/MacOS
java -cp antlr-3.2.jar org.antlr.Tool BoolExp.g
// Windows
javac -cp .;antlr-3.2.jar *.java

// *nix/MacOS
javac -cp .:antlr-3.2.jar *.java
// 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"