<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 首頁 新隨筆 聯(lián)系 聚合 管理
      24 Posts :: 2 Stories :: 4 Comments :: 0 Trackbacks

      要定義一種語言,你只要按照antlr的語法寫一個.g文件,antlr便幫你完成其它的工作,簡化至極,當然我使用了antlt studio工具。
      參考了antlr的經(jīng)典書籍《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
    #
      要實現(xiàn)這個語言,我們的全部工作只要寫一個antlr的.g文件和一個Main測試執(zhí)行類。
      Sample.g
    {
    import java.util.HashMap
    ;//會出現(xiàn)在paser生成類頭部
    }
    class SampleParser extends Parser
    ;
    options {
        k 
    =2; //定義了編譯程序對輸入字符串的預測深度默認是一
       
    }

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

    prog: (stat) + END
    ;//使用這個antlr版本,+?號前必加上( ),否則編譯報錯,出現(xiàn)的字符都必須在lexer里定義,不能出現(xiàn)如'='這種符號
    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 閱讀(1272) 評論(1)  編輯  收藏

    Feedback

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


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 久久精品免费网站网| 亚洲一级片在线观看| 亚洲国产午夜电影在线入口| 三级毛片在线免费观看| a级毛片免费高清视频| 222www免费视频| 亚洲五月六月丁香激情| 一区二区亚洲精品精华液 | 亚洲a级片在线观看| 99热这里有免费国产精品| 四色在线精品免费观看| 亚洲午夜国产精品无码老牛影视| 污视频网站在线观看免费| 亚洲一区在线免费观看| 亚洲大片免费观看| 免费无码又爽又高潮视频| 久久久久亚洲av无码专区导航 | 亚洲一级免费毛片| 午夜爱爱免费视频| 九九热久久免费视频| 亚洲一级毛片视频| 免费一级毛片在播放视频| 久久精品亚洲一区二区三区浴池| 一区二区三区观看免费中文视频在线播放 | 亚洲精品久久无码| 亚洲性久久久影院| 永久免费不卡在线观看黄网站| 婷婷亚洲综合五月天小说| 59pao成国产成视频永久免费| 亚洲欧美日韩一区二区三区在线| 182tv免费观看在线视频| 亚洲中文字幕无码久久| 亚洲?V乱码久久精品蜜桃| 亚洲人成77777在线播放网站不卡| 国产特级淫片免费看| 两个人www免费高清视频| 亚洲成在人线中文字幕| 日韩免费高清视频网站| 华人在线精品免费观看| 亚洲愉拍99热成人精品热久久| 1000部羞羞禁止免费观看视频|