代码之家  ›  专栏  ›  技术社区  ›  INS

野牛的ANTLR语法

  •  2
  • INS  · 技术社区  · 16 年前

    我想把一个语法从bison翻译成ANTLR。语法本身是相当简单的野牛,但我找不到一个简单的方法来做到这一点。

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

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

    谢谢,

    1 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    a : a b
      ;
    

    a : b a
      ;
    

    有关左递归规则的详细信息,请参见 ANTLR's Wiki .

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

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

    BoolExpParser 第(3)类。

    1.

    // 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"
    

    Terence Parr ANTLR reference 在ANTLR上。以及 Scott 创造了一些优秀的 video tutorials