【问题标题】:ANTLR grammar from bison来自野牛的 ANTLR 语法
【发布时间】:2010-03-31 22:26:47
【问题描述】:

我正在尝试将语法从野牛翻译为 ANTLR。野牛的语法本身非常简单,但我找不到简单的方法。

野牛语法:

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

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

谢谢, 尤利安

【问题讨论】:

    标签: antlr grammar bison


    【解决方案1】:

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

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

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

    1

    // 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 ParrANTLR reference关于 ANTLR 的书Scott 在 ANTLR 3(使用 Eclipse)上创建了一些出色的 video tutorials

    【讨论】:

    • 非常感谢 - 我看起来不错。你能给我推荐一个链接/书,我可以在其中阅读更多相关信息吗?编辑:链接很好;再次感谢。
    • 我已经更新了我的答案,提供了指向 Wiki 的链接和书籍推荐。很高兴听到它对您有所帮助。
    • antlr4 现在可以处理直接左递归了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多