初步給出基本過程及遇到的問題和最終源代碼:
步驟一:寫詞法分析器lexer下的各個類,在寫Lexer.java類的時候需要去寫Type.java中基本數據類型,然后轉到Lexer類中
Tag:詞法單元的常量
Word:保留字,標識符合像&&這樣的詞素,單目減號...... Real,Num:繼承於Token,分別處理浮點數和整數 (Num,Word類當new時保留字,Word保留標識符,當new的時候,都會將字賦值給Token,然后就是Word會將Tag中的字保留下來) Token:詞法分析 Lexer:判斷輸入的各個字符、數字、關鍵字、回車等並保存,消除空格多余字符。 步驟二:寫符號表:Array(數組),類型轉化(Type), Env(這里會用到inter里面的id) 步驟三:表達式中間代碼:由上述衍生的id(標識符)和Node的Expr子類Op(衍生出Arith,Unary,reduce子類,Op里面會用到Temp類) 步驟四:布爾表達式的跳轉代碼(Constant中的jumping,類Logical為Or,And,Not類提供一些功能, Rel實現運算符(>,<等的跳轉), 同時還有Access的跳轉) 步驟五:語句中間代碼:stmt下面衍生出的(if, while, dowhile, else, break),和賦值語句(set, setElem,以及seq) 步驟六:語法分析器(Parser即可)
實現效果:
1. 很多時候容易報錯,因為需要用到其他未寫的類,會轉到其他類中寫,但是只要基本底層類寫好,其余都只用寫一點。
2. eclipse本身自帶的問題,inter包中有些類可能對顯示錯誤,只需要刪除一個空格然后恢復保存即可,具體原因未明。
3.由於采用getch讀入,所以最后需要輸入一個字符來退出
4.詞法分析部分:有些類給出並不完整,需要與前面書本講解對照看,理解會更加深刻
源代碼:
鏈接: https://pan.baidu.com/s/1AkqWhRqLxyb443qyzSxp0w 提取碼: 4it6