詞法分析的核心在於,將文法轉換為nfa再轉換為dfa,根據dfa識別出單詞的種別碼。
下面給出rl/0文法的詞彙表:
1.基本字:
begin, call, const, do, end,if, odd, procedure, read,then, var, while, write
對應的種別碼:
beginsym, callsym, constsym, dosym, endsym,ifsym, oddsym, proceduresym, readsym,thensym, varsym, whilesym, writesym
2.識別符號對應的種別碼:ident
3.常數對應的種別碼:number
4.運算子:
+, -, *, /, odd,=, <>, , >=, :=
對應的種別碼:
plus, minus, times, slash,oddsym,eql, neq, lss, leq, gtr, geq,becomes
5.界符
( ) , ;.
對應的種別碼:
lapren,raplen,comma,semicolon,period
下面是簡易的定義,注重過程,不在具體問題上糾結。
識別符號對應的正規式為:(a|…|z)星(0|…|9)星 (暫時不考慮下劃線)
而常數對應的正規式為:(1|…|9)(0|…|9)* (只考慮無符號的整數)
可以畫出nfa
由於很接近dfa,直接給出狀態轉換表:
據此可以完成編碼。
詞法分析流程圖:
詞法分析程式:
據此就可以編寫程式:
public class main
//詞法分析返回二元組
sb=new la().g(sb);
system.out.println(sb);
}}
public class la
public la()
public int getblank(string a)
else if(flag==6||flag==3||flag==4)
else
}else
break;
}if(flag==5)
else if(flag==6)
else
}else if(flag==0)
else if(x<='z'&&x>='a')
else
}else if(flag==1||flag==2)
else
}else if(flag==3||flag==4)
else if(x<='9'&&x>='0')
else}}
return l;
} public int jy(int l,string a)
else if(s.equals(">")&&l=r) break;
l=jy(l,a);
"l="+l);
if(l>=r) break;
if(o==l)
o=l;
}} }
public stringbuffer g(stringbuffer a)
return tf;
}}
編譯原理 詞法分析器
1 從源程式檔案中讀入字元。2 統計行數和列數用於錯誤單詞的定位。3 刪除空格類字元,包括回車 製表符空格。4 按拼寫單詞,並用 內碼,屬性 二元式表示。屬性值 token 的機內表示 5 如果發現錯誤則報告出錯 6 根據需要是否填寫識別符號表供以後各階段使用 int tag 0 設立標誌 一開始本...
編譯原理,例 詞法分析器
編譯原理課作業要求自己寫乙個詞法分析器,我嘗試寫了一下。詞法分析 電腦科學中將字串行轉換為單詞 token 序列的過程。進行詞法分析的程式或者函式叫作詞法分析器 lexical analyzer 也叫掃瞄器 scanner 詞法分析器一般以函式的形式存在,供語法分析器呼叫。完成詞法分析任務的程式稱為...
編譯原理(一)詞法分析器
詞法分析器的功能是輸入源程式,輸出單詞符號。單詞符號是乙個程式語言的基本語法符號。程式語言的符號一般可以定義為以下幾種 關鍵字 是由程式語言定義的具有固定意義的識別符號,也稱這些識別符號為保留字或基本字。例如 c 語言中的define do for while if else等 識別符號用來表示各種...