<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    雪湖小札@blogjava

    心情與技術文檔同行 http://hi.baidu.com/jingleq

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      24 Posts :: 2 Stories :: 4 Comments :: 0 Trackbacks

      要定義一種語言,你只要按照antlr的語法寫一個.g文件,antlr便幫你完成其它的工作,簡化至極,當然我使用了antlt studio工具。
      參考了antlr的經典書籍《The Definitive ANTLR Reference》寫了一個小例子(姑且稱之為語言),呵呵。
      我使用了antlr studio 1.1.0里面提供的antlr庫,可能是版本問題,使用《The Definitive ANTLR Reference》里面的四則運算的例子居然通過不了,具汗``
      語法示例:我們可以這樣輸入(紅色為我們的輸入,黑色為輸出)

    i=4
    j=6+5*3
    c=i+j
    c
    > 25
    j
    > 21 
    i = j*(3+1)
    i
    > 84
    #
      要實現這個語言,我們的全部工作只要寫一個antlr的.g文件和一個Main測試執行類。
      Sample.g
    {
    import java.util.HashMap
    ;//會出現在paser生成類頭部
    }
    class SampleParser extends Parser
    ;
    options {
        k 
    =2; //定義了編譯程序對輸入字符串的預測深度默認是一
       
    }

    {
        HashMap memory 
    = new HashMap();//出現在paser生成類的構造函數處
    }

    prog: (stat) + END
    ;//使用這個antlr版本,+?號前必加上( ),否則編譯報錯,出現的字符都必須在lexer里定義,不能出現如'='這種符號
    stat {
        Integer e
    ;//申明action里使用到的變量
    }:  NEWLINE
        | (id:ID EQ e
    =expr NEWLINE) 
        {memory.put(id.getText()
    , new Integer(e));}
        |(id1:ID NEWLINE) {
            Integer v 
    = (Integer)memory.get(id1.getText());
            System.out.println(v);
        }| (e=expr NEWLINE) {System.out.println(e);};

    expr returns 
    [int value=0]{
        Integer e1
    ,e2;
    }: 
        (e1
    =multExpr) {value = e1;}
        ( ADD (e2=multExpr) {value += e2;}
        | DES (e2=multExpr) {value -= e2;})*;

    multExpr returns 
    [int value=0]{
        Integer at1
    ,at2;
    }: 
        (at1
    =atom) {value = at1;}(CH at2=atom{value*=at2;})*;

    atom returns 
    [int value=0]{
        Integer e
    ;
    }: 
        (i:INT) {
            value 
    = Integer.parseInt(i.getText());
        } | (id:ID)  {
            Integer v 
    = (Integer)memory.get(id.getText());
            if ( v!=null ) value = v.intValue();
            else System.err.println("undefined variable "+id.getText());
        }| (KL e=expr KR){
            value 
    = e;
        } ;

    class SampleLexer extends Lexer
    ;
    ID : ('a'..'z' |'A'..'Z' )+ ;
    INT : ('0'..'9') + ;
    NEWLINE: ('\r') ? '\n';
    WS : (' ' |'\t' |'\n' |'\r' )+  ;
    ADD: '+';
    DES: '-';
    CH: '*';
    KL: '(';
    KR: ')';
    EQ: '=';
    END: '#';

    import antlr.RecognitionException;
    import antlr.TokenStreamException;


    public class Main {

        
    /**
         * 
    @param args
         
    */

        
    public static void main(String[] args) {
            SampleLexer lexer 
    = new SampleLexer(System.in);
            SampleParser parser 
    = new SampleParser(lexer);
            
    try {
                parser.prog();
            }
     catch (RecognitionException e) {
                e.printStackTrace();
            }
     catch (TokenStreamException e) {
                e.printStackTrace();
            }

        }

    }

     

    posted on 2007-06-19 19:33 csnowfox 閱讀(1278) 評論(1)  編輯  收藏

    Feedback

    # re: antlr-語言編譯的簡化 2007-06-19 20:58 山風小子
    是antlr2的寫法  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚欧免费无码aⅴ在线观看| 亚洲国产精品嫩草影院| 亚洲第一视频在线观看免费| 成人午夜视频免费| 亚洲中文字幕无码中文| 国产成人免费网站在线观看| 亚洲AV网一区二区三区| 亚洲?V无码成人精品区日韩 | 中文字幕精品亚洲无线码一区应用| 男人免费视频一区二区在线观看| 免费永久在线观看黄网站| 免费无码午夜福利片69| 亚洲一级Av无码毛片久久精品 | 亚洲中文字幕久久精品无码APP| 国产精品综合专区中文字幕免费播放| 精品国产香蕉伊思人在线在线亚洲一区二区 | 猫咪社区免费资源在线观看| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 精品亚洲综合久久中文字幕| 99久久婷婷免费国产综合精品| 亚洲av激情无码专区在线播放| 120秒男女动态视频免费| 亚洲国产精品免费观看| 又粗又大又长又爽免费视频| A级毛片成人网站免费看| 亚洲国产成人精品不卡青青草原| 久热中文字幕在线精品免费| 亚洲爆乳无码精品AAA片蜜桃| 亚洲精品无码久久毛片| 91精品啪在线观看国产线免费| 色噜噜亚洲男人的天堂| 亚洲第一黄片大全| 无码日韩精品一区二区三区免费| 亚洲人成小说网站色| 国产亚洲精品看片在线观看| 4444www免费看| 阿v视频免费在线观看| 亚洲综合一区二区国产精品| 全免费a级毛片免费看无码| 丝袜捆绑调教视频免费区| 亚洲一区二区三区免费视频|