zoukankan      html  css  js  c++  java
  • Antler 工具使用(.g 转.java / .cs)

    1. JAVA环境

    2. Antler 工具包:

      antlr-3.5.1-complete-no-st3.jar  

      路径加入classpath

    3. cmd命令行:

        java org.antlr.Tool XXXXX.g

      (此命令可生成.java或.cs文件等,因.g文件中内容而异)

        1).g (转成.cs)  实例:

    grammar SimpleCalc;
    
    options {
        language=CSharp2;
    }
    
    tokens {
        PLUS     = '+' ;
        MINUS    = '-' ;
        MULT    = '*' ;
        DIV    = '/' ;
    }
    
    @members {
            static void Main(string[] args)
            {
                string source = Console.ReadLine();
                SimpleCalcLexer lex = new SimpleCalcLexer(new ANTLRStringStream(source));
                CommonTokenStream tokens = new CommonTokenStream(lex);
                SimpleCalcParser parser = new SimpleCalcParser(tokens);
                try
                {
                    Console.WriteLine(parser.expr());
                }
                catch (RecognitionException e)
                {
                    Console.Error.WriteLine(e.StackTrace);
                }
                Console.ReadLine();
            }
    }
    
    //PARSER RULES
    expr returns [int value] :
        e=term { $value=$e.value; }
        (   
          PLUS e=term { $value += $e.value; }
          |
          MINUS e=term { $value -= $e.value; }
        )*;
    term returns [int value] : 
        e=factor { $value = $e.value; }
        (
          MULT e=factor { $value *= $e.value; }
          |
          DIV e=factor { $value /= $e.value; }
        )* ;
    factor returns [int value] : NUMBER { $value = int.Parse($NUMBER.text); };
    
    //LEXER RULES
    NUMBER    : (DIGIT)+ ;
    WHITESPACE : ( '	' | ' ' | '
    ' | '
    '| 'u000C' )+     { $channel = HIDDEN; } ;
    fragment DIGIT    : '0'..'9' ;
    c# SimpleCalc.g

      2)  .g (转成.java)实例:

    grammar Expr;
    
    @header {
    import java.util.HashMap;
    }
    
    @members {
    /** Map variable name to Integer object holding value */
    HashMap memory = new HashMap();
    }
    
    prog:   stat+ ;
                    
    stat:   expr NEWLINE {System.out.println($expr.value);}
        |   ID '=' expr NEWLINE
            {memory.put($ID.text, new Integer($expr.value));}
        |   NEWLINE
        ;
    
    expr returns [int value]
        :   e=multExpr {$value = $e.value;}
            (   '+' e=multExpr {$value += $e.value;}
            |   '-' e=multExpr {$value -= $e.value;}
            )*
        ;
    
    multExpr returns [int value]
        :   e=atom {$value = $e.value;} ('*' e=atom {$value *= $e.value;})*
        ; 
    
    atom returns [int value]
        :   INT {$value = Integer.parseInt($INT.text);}
        |   ID
            {
            Integer v = (Integer)memory.get($ID.text);
            if ( v!=null ) $value = v.intValue();
            else System.err.println("#ff0000 variable "+$ID.text);
            }
        |   '(' expr ')' {$value = $expr.value;}
        ;
    
    ID  :   ('a'..'z'|'A'..'Z')+ ;
    INT :   '0'..'9'+ ;
    NEWLINE:'
    '? '
    ' ;
    WS  :   (' '|'	')+ {skip();} ;
    JAVA Expr.g

    4. 生成的.cs需要的依赖包:Antlr3.Runtime.dll

    参考:

    http://www.cnblogs.com/RicCC/archive/2008/03/01/antlr-getting-started-examples.html

  • 相关阅读:
    三个习题
    20 python--celery
    19 python --队列
    18 python --多线程
    17 python --多进程
    16 python --memcached
    15 python --redis
    14 python --mysql
    13 python --正则
    12 python --json
  • 原文地址:https://www.cnblogs.com/-wangjiannan/p/3554616.html
Copyright © 2011-2022 走看看