雪湖小札@blogjava

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

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            24 Posts :: 2 Stories :: 4 Comments :: 0 Trackbacks

          常用鏈接

          留言簿(4)

          我參與的團(tuán)隊(duì)

          隨筆檔案(24)

          文章檔案(2)

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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

          i=4
          j=6+5*3
          c=i+j
          c
          > 25
          j
          > 21 
          i = j*(3+1)
          i
          > 84
          #
            要實(shí)現(xiàn)這個(gè)語(yǔ)言,我們的全部工作只要寫一個(gè)antlr的.g文件和一個(gè)Main測(cè)試執(zhí)行類。
            Sample.g
          {
          import java.util.HashMap
          ;//會(huì)出現(xiàn)在paser生成類頭部
          }
          class SampleParser extends Parser
          ;
          options {
              k 
          =2; //定義了編譯程序?qū)斎胱址念A(yù)測(cè)深度默認(rèn)是一
             
          }

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

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

          Feedback

          # re: antlr-語(yǔ)言編譯的簡(jiǎn)化 2007-06-19 20:58 山風(fēng)小子
          是antlr2的寫法  回復(fù)  更多評(píng)論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 山阳县| 惠来县| 天祝| 台州市| 峨边| 南阳市| 仁寿县| 宾阳县| 开远市| 会宁县| 盐城市| 碌曲县| 平罗县| 麻栗坡县| 贵定县| 个旧市| 北海市| 南安市| 土默特左旗| 施甸县| 文登市| 敖汉旗| 澄江县| 郸城县| 黄骅市| 西林县| 昆山市| 保靖县| 苏尼特右旗| 白银市| 黄山市| 广东省| 亚东县| 漠河县| 安化县| 独山县| 安岳县| 南木林县| 屯门区| 抚远县| 井冈山市|