<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 閱讀(1272) 評論(1)  編輯  收藏

    Feedback

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


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


    網站導航:
     
    主站蜘蛛池模板: 婷婷亚洲综合一区二区| 亚洲AV一二三区成人影片| 久久亚洲AV成人无码国产电影| 久草视频免费在线观看| 91亚洲国产成人久久精品| 亚洲激情在线观看| 亚洲成人激情小说| 男女拍拍拍免费视频网站| 四虎影在线永久免费观看| 内射干少妇亚洲69XXX| 亚洲最大中文字幕无码网站| 岛国av无码免费无禁网站| 亚洲精品视频免费观看| 无码AV动漫精品一区二区免费| 久久精品亚洲福利| 亚洲AV成人一区二区三区观看| 国产小视频免费观看| yellow免费网站| 亚洲天堂中文资源| 青娱乐免费视频在线观看| 亚洲av日韩av永久在线观看| 亚洲精品一级无码鲁丝片 | 免费又黄又爽又猛大片午夜 | 免费国产草莓视频在线观看黄| 亚洲国产高清在线一区二区三区| 亚洲日本在线播放| 99久久免费国产特黄| 久久精品国产亚洲AV嫖农村妇女| 在线观看免费人成视频色9| 亚洲精品无码久久久久A片苍井空| 国产亚洲精品免费| 精品国产免费一区二区三区香蕉 | 国产精品日本亚洲777| 免费一本色道久久一区| WWW亚洲色大成网络.COM| 国产成人精品日本亚洲| 无码少妇一区二区浪潮免费| 一级人做人a爰免费视频 | 亚洲成在人线在线播放无码| 中文字幕在线亚洲精品| 国产日本一线在线观看免费|