㈠ 編譯原理——LR分析表
自底向上的語法分析
LR分析表的結構如上,其分為兩個部分 Action Goto
兩個參數狀態i,終結符號a(s(i)代表第i個狀態,r(i)代表第i條表達式)
Goto[i,A]=j
文法
容易得知這個文法可以推出 0 1 00 01 等的字元串。因為它是 左遞歸 。不適用於 LL 文法分析,只能使用 LR 分析。
因為本題入口有兩個—— S → L·L S → L ,所以需要構造額外的產生式 S'->S
2.1 第一次遍歷
我們從 [S -> . L·L] 開始,構造這個狀態的閉包,也就是加上所有能從這個產生式推出的表項。
首先,判斷 . 後面是否為 非終結符號A 。如果是,那我們就得找所有由 A-> 推出的產生式,並將它們添加進入 閉包 里(也就是State包里)。循環做即可。
因此我們可以得到 State 0 有
下一步,就是我的 . 往下一位移動。對每個符號X後有個 . 的項,都可以從 State 0 過渡到其他狀態。
由以上6條式子可以得知下一位符號可以是 S L B 0 1 。所以自然可以得到5個狀態。
State 1 是由 State 0 通過 S 轉移到這里的,所以我們找出所有 State 0 中在 S 前有 . 的項。
此狀態作為結束狀態 Accept ,不需要繼續狀態轉移了。
State 2 是由 State 0 通過 L 轉移到這里的,所以我們找出所有 State 0 中在 L 前有 . 的項。
S -> . L·L S -> . L L -> . LB
有3條式子,現在我們將 . 向後推一格,就得到 State 1 的項了。
但是 . 之後的符號分別是 · $ B , B 為非終結符號,我們得包含 B -> 的項
State 3 是由 State 0 通過 B 轉移到這里的,所以我們找出所有 State 0 中在 B 前有 . 的項。
因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。
State 4 是由 State 0 通過 0 轉移到這里的,所以我們找出所有 State 0 中在 0 前有 . 的項。
因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。
很簡單,同樣的道理找 State 5
State 5 是由 State 0 通過 1 轉移到這里的,所以我們找出所有 State 0 中在 1 前有 . 的項。
因為 . 後沒有其他符號了,因此這個狀態不需要繼續轉移了。
好的,現在我們第一次遍歷完成。
2.2 第二次遍歷
第二次遍歷自然從 State 2 開始。
我們回到 State2 ,可以看出 . 之後的符號有 · B 0 1 。
State 6 是由 State 2 通過 · 轉移到這里的,所以我們找出所有 State 2 中在 · 前有 . 的項。
S -> L. ·L 只有1條,我們往後移發現 L 又為非終結符號,參考 State 0 做的操作,我們得找出所有的式子。
共有5條式子,共同組成 State 6 ,由上面的式子可以看出我們還得繼續下一次遍歷。先不管著,我們進行下一次狀態查找。
State 7 是由 State 2 通過 B 轉移到這里的,所以我們找出所有 State 2 中在 B 前有 . 的項。
L -> L. B 也是只有1條,我們往後移發現沒有非終結符號了,那就不需要再繼續添加其他式子了。
這個狀態也不需要繼續進行轉移了。
接下來很關鍵,因為我們通過 State2 的 . 後的符號找出了 State 6 State 7 ,接下來還差符號 0 1 ,那麼是否像之前一樣按例添加狀態呢, 答案是不是的 ,因為我們發現通過 0 1 找到的閉包集分別是 B -> 0 B -> 1 ,這與我們的之前的 State 4 State 5 相同。所以我們得將其整合起來,相當於 State 2 通過 0 1 符號找到了 State 4 State 5 狀態。
2.3 第三次遍歷
回頭看第二次遍歷,可以看出只有 State 6 可以進行狀態轉移了。
那麼就將 State 6 作為第三次遍歷的源頭,可以看出 . 之後的符號有 L B 0 1 。
State 8 是由 State 6 通過 L 轉移到這里的,所以我們找出所有 State 6 在 L 前有 . 的項。
S -> L· .L L -> . LB 有兩條式子,往後移發現有非終結符號 B ,所以經過整合可以得到
可以看出 . 的後面還有一個符號,所以這里我們還得再進行一次遍歷。
接下來,又是遇到重復的包的情況,可以看出我們由 State 6 通過 B 0 1 得到的閉包分別是 L->B B->0 B->1 ,很明顯,這分別對應於 State 3 State 4 State 5 。
第三次遍歷也就結束了。
2.4 第四次遍歷
回看第三次遍歷,可以看出只有 State 8 可以進行狀態轉移,其 . 之後的符號分別是 B 0 1 。
誒,感覺很熟悉,就是上面幾行剛說的情況,也就是說通過這三個符號找到的閉包是我們之前遇到的狀態,分別是 State 3 State 4 State 5 。
做到這里,我們發現我們已經全部遍歷完畢!
總共有8個狀態,通過以上流程做成個圖是什麼樣子的?來看看!
這么一看就很清晰明了了,我們就可以通過這個圖做出我們的 LR分析表
其實就是我們之前呈現的表
在狀態 I2 和 I8 中,既有 移入 項目,也有 規約 項目,存在 移入 - 規約的沖突 ,所以不是 LR(0) 文法,但是因為 FOLLOW(S) ∩ {0, 1} = ∅,所以可以用 FOLLOW 集解決沖突,所以該文法是 SLR(1) 文法。
上表我們發現還有 r1,r2,r3 等。這個其實就是代表狀態停止轉移時為 第幾條表達式 ,r3代表第三條表達式 L -> LB 。
當我們構建了表之後,我們如何運用起來呢?
下面我們通過一個例子來說明
以上字元串是如何被SLR分析器識別的呢?
㈡ 如何編譯一個java文件
javac 用於編譯Java文件,格式為:
java [options] [sourcefiles] [@files]
其中:
options:命令行選項;
sourcefiles:一個或多個要編譯的源文件;
@files:一個或多個對源文件進行列表的文件,有時候要編譯的文件很多,一個個敲命令會顯得很長,也不方便修改,可以把要編譯的源文件列在文件中,在文件名前加@,這樣就可以對多個文件進行編譯,對編譯一個工程很有用,方便,省事。
有幾個比較重要的選項:
-d 用於指定編譯成的class文件的存放位置,預設情況下不指定class文件的存放目錄,編譯的class文件將和源文件在同一目錄下;
-classpath 可以簡寫成-cp,用於搜索編譯所需的class文件,指出編譯所用到的class文件的位置,如jar、zip或者其他包含class文件的目錄,指定該選項會覆蓋CLASSPATH的設定;
-sourcepath用於搜索編譯所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目錄;
需要注意windows下和linux下文件路徑分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的區別:
windows下文件路徑分隔符用 \ ,文件列表分隔符用分號 ;
linux下文件路徑分隔符用 / ,文件列表分隔符用冒號 :
㈢ wps密碼編譯對照表在哪
文檔加密中。wps密碼編譯對照表在文檔加密中,需要使用WPS打開表格,點擊左上角菜單欄「文件」選項,在文件展開菜單中依次點擊「文檔加密」,點開「加密文檔」即可看到wps密碼編譯對照表。
㈣ Excel表格函數編程怎麼編
函數編程?應該是自定義函數吧?下面為操作步驟:
1.Alt+F11,右鍵左上角空白處,插入模塊