編譯-詞法語法分析
阿新 • • 發佈:2021-08-12
詞法分析
怎樣去匹配。分割。
正則表示式--
集合
集合的運算。
元素相加 並 -- 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.呼叫下面的節點等賦值,賦值好後自己返回。