1. 程式人生 > 其它 >編譯-詞法語法分析

編譯-詞法語法分析

詞法分析 怎樣去匹配。分割。 正則表示式-- 集合 集合的運算。 元素相加 並 -- X|Y 元素相乘 連線--XY,笛卡爾積. 加入迴圈-- 克林閉包-- 記作X* 邏輯運算子 ^--排除,[^ab]就表示除了ab以外所有字元求並。 X?--可選 更多規則 X+表示XX*。這等於限制了X至少要重複1次 簡化替代- 狀態機 把正則表示式轉換成可以計算機執行的語言。 這些的內涵都是正則語言, 有窮狀態機(FA)--有限狀態。 狀態-圖的節點 初始狀態 接受狀態-黑圈表示 狀態轉換- 圖的邊 確定性有窮狀態機(DFA)--一個狀態只有一種狀態轉換 非確定性有窮狀態機(NFA)-一個狀態有多種狀態轉換。 這個理解不對。還要加入’某個條件下‘這個限定。 一個狀態在不同條件下有多個狀態轉換,也是DFA 這裡有個ε(表示空)符號的邊。不輸入字元也算一種狀態轉換。 主要這裡導致變得複雜好多。 比如要匹配一個字元,並沒有定義結束符,那輸入一個字母后,隨時都可以轉到接受狀態。 而且一個狀態可以由好幾個ε邊。 有點這個狀態潛在可能發生的改變。 有點先把框架定下來, [a-z][a-z0-9]* 克林閉包-就是畫個迴圈圈 正則可以畫出NFA,NFA可以轉化成多個DFA,DFA就能判定結果? NFA-DFA的轉化 感覺就是窮舉遍歷所有路徑,每條路徑上的組合就是一個DFA。 基本術語。 一個狀態 ,由所有路徑連線的終點,可以形成一個關係。達到的狀態形成一個集合。 沿著字元c的路徑 ,形成的集合記作-- edge(s,c) ε-閉包--這個是’關係‘上面的閉包概念? 表示從狀態s出發,沿著ε邊到達的狀態關係。相當於edge(s,ε)? 然後這個閉包關係可以作用到一個集合--記作closure(X)。 這裡一般理解都是 多種轉換可能作為一個集合。多種轉換能遍歷完,得到的每個集合都是一個DFA 初始狀態集合。開始狀態+ε邊。 輸入字元C的集合,i邊,([2],[5,8,6],[15]) ->f邊,(2->[3],6->[7,8,6]);->字母,數字邊 a-h,j-h ([5,8,6],[15]) 0-9 ([10,13,11],[15]) other [15] 看著就是邊所有連線的狀態,再加該狀態的ε閉包。 這個路線能看懂,那一個個集合是啥,整體看著是一個DFA圖,只是裡面的狀態是一個集合。 這個狀態集合就是DFAedge? 這裡感覺是怎麼畫出NFA圖是很有講究的。 DFA轉化到'狀態轉換表'--》掃描器 最長匹配。 語法分析 上下文無關語言 語法的定義-產生式 非終結符N 產生關係→ 終結符'()' 這個看著很神奇, N →a (N,N) N →ε 這樣就能表達一個二叉樹了。。這個式子即能定義值,又能定義結構。還能迭代。 推導 把表示式-------》語法分析樹 這裡怎麼把語法轉化成產生式。語法五花八門的。 這個產生式還要是能正確轉換到分析樹的格式。 遞迴下降法來實現分析樹。。。? A(B(,C(,)),D(,) )--》思維分析過程 如果是產生式的模式呢。 N->a(N,N) csj1 N->ε csj2 loopfun(parentnode,childtag,substring) if char=a then node=cv; substing=括號內資料,哪個括號結束難以明確哎。 parentnode.childtag=node loopfun(node,lefttag,substring); else if char=',' loopfun(poarentnode,righttag,substring); parsenode() if char==letter { label=char leftnode=parsenode() skipdot; right=parsenode() } 這裡產生式感覺是要全域性來看,保持結構的完整性,空白也要保持結構。 函式內只關注自己是不是個節點,是的話就按結構展開,獲取左右節點,處理結構內的標記符號。 不管這個節點下面包含了多少子節點,就寫跳過逗號 ,不用管這個逗號具體在哪裡,它就出現在改待的位置。 真是很奇特的感覺 這裡文法上下面沒有子節點,也要把結構字元都寫完整(,) 和原先那種步進思維相比 1.每一層都賦值好節點值。 2.呼叫下面的節點等賦值,賦值好後自己返回。