(編譯原理)java實現詞法分析器__編譯原理

來源:互聯網
上載者:User
1、閑話

最近在學編譯原理,需要用語言實現一個詞法分析器,其實挺簡單的,主要涉及一些語言字串操作處理,如果會Regex的話,感覺實現這個會很簡單,但是我並不會啊,然後自己用java實現了,也算是加強了對java的一些字元操作方法的使用。

實現這個分析器,演算法上基本上沒什麼難度,但是其中涉及的一些邏輯上的思考,說白了就是這麼多種情況,有寫情況還有交叉部分,你怎麼讓自己不繞進去,並且用代碼實現自己的對這個問題思路。

那麼閑話就說到這,具體我怎麼想的,怎麼處理的看下面

2、問題要求 一、 實驗目的

設計、編製並調試一個詞法剖析器,加深對詞法分析原理的理解。 二、 實驗內容

2.1 待分析的簡單詞法

(1)關鍵字:所有的關鍵字都是小寫
begin if then while do end (2)運算子和界符 := + - * / < <= <> > >= = ; ( ) #

(3)其他單詞是標識符(ID)和整型常數(NUM),通過以下正規式定義:

ID = letter (letter | digit)*
NUM = digit digit*

(4)空格有空白、定位字元和分行符號組成。空格一般用來分隔ID、NUM、運算子、界符和關鍵字,詞法分析階段通常被忽略。

2.2 各種單詞符號對應的種別碼:

2.3 詞法剖析器的功能:

輸入:所給文法的來源程式字串。輸出:二元組(syn,token或num)構成的序列。其中:syn為單詞種別碼;      token為存放的單詞自身字串;      num為整型常數。例如:對來源程式begin x:=9; if x>9 then x:=2*x+1/3; end #的源檔案,經過詞法分析後輸出如下序列:(1,begin) (10,x) (18,:=) (11,9) (26,;) (2,if)……


3、思維導圖

先上思維導圖, 根據思維導圖看看我是怎麼想這個問題的。


4、代碼實現

關鍵代碼:

    /**     * 將按間隔符分好的list進行判斷,判斷是否是合法的子串     * @param list     * @return     */    @SuppressWarnings("rawtypes")    public List<Map> GetStringAndSortNum(String[] list) {        char firstChar;//用於記錄第一個首字元        String keyword="",sortNum="";//需要輸出返回的關鍵字,種別碼        String cType,word;//第一個首字元的類型        //mlist用於返回整個List判斷完成後的含有的字元和種別碼        List<Map> mList=new ArrayList<Map>();        for(int i=0;i<list.length;i++){            Map<String,String>map=new HashMap<String,String>();//m用於儲存最後返回的已經判別成功的字和種別碼            //word代表需要進行處理判斷的字            word=list[i];            //判斷word是不是空的串,因為有可能根據空格分割的串中有空的分行符號或者空串,不進行處理            if(word==""||word==null||word.trim()=="")continue;            firstChar=word.charAt(0);            //擷取這個字元的類型            cType=GetCharType(firstChar);            if(cType=="letter"){                if(firstChar=='w'||firstChar=='i'||firstChar=='b'||firstChar=='d'||firstChar=='e'||firstChar=='t'){                    //獲得keyword詞                    Map<String,String>m=new HashMap<String,String>();//m用於儲存最後返回的已經判別成功的字和種別碼                    m=GetKeyWord(word);                    //取出m的值,如果是關鍵字                    if(m!=null){                        keyword=m.get("keyword");                        sortNum=m.get("sortNum");                    }                    //不是關鍵字,但是包含關鍵字的前一個字串                    else{                        if(IsID(word)){                            keyword=word;                            sortNum=g.getSortNum("ID")+"";                        }                        else{                            System.out.println("這個"+word+"不是合法的ID字元,所在的位置在:第"+(i+1)+"個單詞");                        }                    }                }                else{//首字母為字元,但是需要進一步判斷是不是合法的ID                    if(IsID(word)){                        keyword=word;                        sortNum=g.getSortNum("ID")+"";                    }                    else{                        System.out.println("這個"+word+"不是合法的ID字元,所在的位置在:第"+(i+1)+"個單詞");                    }                }            }            if(cType=="digit"){                if(IsNum(word)){                    keyword=word;                    sortNum=g.getSortNum("NUM")+"";                }                else{                    System.out.println("這個"+word+"不是合法的NUM字元,所在的位置在:第"+(i+1)+"個單詞");                }            }            if(cType=="opts"){                //擷取這個word的長度,如果是一個進行單運算子的判斷,如果是2進行多運算子的判斷                int len=word.length();                if(len==1){                    if(IsSingleOpt(word)){                        keyword=word;                        sortNum=g.getSortNum(word)+"";                    }                    else if(IsEndOpt(word)){                        keyword=word;                        sortNum=g.getSortNum(word)+"";                    }                    else{                        System.out.println("這個"+word+"不是合法的NUM字元,所在的位置在:第"+(i+1)+"個單詞");                    }                }                else if(len==2){                    if(IsDoubleOpt(word)){                        keyword=word;                        sortNum=g.getSortNum(word)+"";                    }                    else{                        System.out.println("這個"+word+"不是合法的NUM字元,所在的位置在:第"+(i+1)+"個單詞");                    }                }                else{                    System.out.println("這個"+word+"不是合法的NUM字元,所在的位置在:第"+(i+1)+"個單詞");                }            }            if(keyword.equals("")||sortNum.equals("")||keyword==""||sortNum=="")                continue;            else{                map.put("keyword", keyword);                map.put("sortNum", sortNum);                mList.add(map);                 keyword="";                sortNum="";            }        }        return mList;    }

代碼實現後的運行效果:

測試用的檔案:

begin x := 9 ; if x > 9 then x := 2 * x + 1 / 3x = 3 ;begin$y := 2if x == $y :y = qqwe221 ;

其實看起來很複雜的一個詞法分析器,當真正借組思維導圖或者其他的流程圖表示出來的時候,實現思路在腦子裡就會很清晰,自己下一步要幹嘛,怎麼實現,當自己想到這些的時候,可以用自己喜歡的形式記錄下來,這樣實現起來就只需要用代碼把自己的思路複現即可。

養成一種編程的習慣有時候比掌握一門語言對自己更有利。

本詞法分析器的源碼和測試檔案均放在github上,需要的請自行進行查看。
https://github.com/Ashplumage/Compile-principle

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.