一. 總體實現思想
我採用自頂向下的預測分析技術來實現,其基本方法如下:
從文法開始符號出發,在每一步推導過程中根據當前句型的最左非終結符A和當前輸入符號a,選擇正確的A-產生式。爲保證分析的確定性,選出的候選式必須是唯一的。具體的非遞歸的預測語法分析結構如下所示:
非遞歸的預測分析不需要爲每個非終結符編寫遞歸下降過程,而是根據預測分析表構造一個自動機,也叫表驅動的預測分析
表驅動的預測分析法的算法
3.1輸入:一個串w和文法G的分析表 M
3.2輸出:如果w在L(G )中,輸出w的最左推導;否則給出錯誤指示
3.3方法:最初,語法分析器的格局如下:輸入緩衝區中是w,G的開始符號位於棧頂,其下面是 。下面的程序使用預測分析表M生成了處理這個輸入的預測分析過程
設置ip使它指向w的第一個符號,其中ip 是輸入指針;
令X=棧頂符號;
while ( X ≠ $ ){ / * 棧非空 */
if ( X 等於ip所指向的符號a) 執行棧的彈出操作,將ip向前移動一個位置;
else if ( X是一個終結符號) error ( ) ;
else if ( M[X,a]是一個報錯條目) error ( ) ;
else if ( M[X,a] = X →Y1Y2 … Yk ){
輸出產生式 X →Y1Y2 … Yk ;
彈出棧頂符號;
將Yk,Yk-1 …,Yi 壓入棧中,其中Y1位於棧頂。
}
令X=棧頂符號
}
4.非遞歸的預測分析法主控程序規模較小,需載入分析表(表較小),直觀性較差,分析時間大約正比於待分析程序的長度,但是自動生成較容易
5. 預測分析法的實現步驟
1)構造文法
2)改造文法:消除二義性、消除左遞歸、消除回溯
3)求每個變量的FIRST集和FOLLOW集,從而求得每個
候選式的SELECT集
4)檢查是不是 LL(1) 文法。若是,構造預測分析表
5)對於遞歸的預測分析,根據預測分析表爲每一個非終結
符編寫一個過程;對於非遞歸的預測分析,實現表驅動
的預測分析算法,我們採用的是後面一種
6.預測分析的錯誤處理
6.1錯誤檢測:
棧頂的終結符和當前輸入符號不匹配、
棧頂非終結符與當前輸入符號在預測分析表對應項中的信息爲空
6.2恐慌模式
6.2.1忽略輸入中的一些符號,直到輸入中出現由設計者選定的同步詞法單元(synchronizing token)集合中的某個詞法單元
1)其效果依賴於同步集合的選取。集合的選取應該使得語法分 析器能從實際遇到的錯誤中快速恢復。例如可以把FOLLOW(A)中的所有終結符放入非終結符A的同步記號集合
6.2.2如果終結符在棧頂而不能匹配,一個簡單的辦法就是彈出此終結符
6.2.1分析表的使用方法
如果M[A,a]是空,表示檢測到錯誤,根據恐慌模式,忽略輸入號a
如果M[A,a]是synch,則彈出棧頂的非終結符A,試圖繼續分析後面的語法成分
如果棧頂的終結符和輸入符號不匹配,則彈出棧頂的終結符
二. C語言文法設計
- c語言基本程序主要是由函數定義組成,故定義文法爲:
program->function_definition program'
program'->function_definition program'|$ //c語言的程序構造
- 而函數定義又包括了類型定義、函數聲明、複合聲明,故文法定義爲
function_definition->type_specifier declarator_func compound_statement
type_specifier->VOID|CHAR|INT|FLOAT //函數定義
- 函數聲明又包含函數名字和參數,故文法所以定義爲
declarator_func->ID dec' //declarator_func函數聲明
declarator->ID dec
dec->[ DIGIT ]|$
dec'->( declarator'|$
declarator'->parameter_list )|)
parameter_list->parameter_declaration parameter_list'
parameter_list'->, parameter_declaration parameter_list'|$
parameter_declaration->declaration_specifiers ID //參數說明
declaration_specifiers->CHAR|INT|FLOAT //聲明說明符
- 複合聲明又包括變量聲明、{、}、語句聲明等
compound_statement->{ compound_statement'
compound_statement'->statement_list }|declaration_list statement_list }|}
- 變量聲明又包含聲明說明符、,、=,初始化等等
declaration_list->declaration declaration_list'
declaration_list'->declaration declaration_list'|$
declaration->declaration_specifiers init_declarator declaration'
declaration'->, init_declarator declaration'|$
init_declarator->declarator init_declarator'
init_declarator'->= initializer|$
initializer->relational_expression|{ initializer_list }
initializer_list->initializer initializer_list'
initializer_list'->, initializer , initializer_list'|$
- 語句聲明包括複合語句聲明、表達式語句聲明、選擇語句聲明、迭代語句(如while)聲明、跳轉語句聲明等
statement_list->statement statement_list'
statement_list'->statement statement_list'|$
statement->compound_statement|expression_statement|selection_statement|iteration_statement|declaration_list|jump_statement
- 跳轉語句包括continue、break、return等
jump_statement->CONTINUE ;|BREAK ;|RETURN jump_statement'
jump_statement'->;|expression ;
- 選擇語句(分支語句)包括if、else等
selection_statement->IF ( expression ) compound_statement selection_statement'
selection_statement'->ELSE statement|$
- 迭代語句包括while、for等等
iteration_statement->WHILE ( expression ) statement|FOR ( expression_statement expression_statement expression ) statement
expression->relational_expression expression'
expression'->, relational_expression expression'|$
- 表達式語句包含各種語句的組合,故文法設計如下
expression_statement->;|expression ;
relational_expression->additive_expression relational_expression'
relational_expression'->< additive_expression relational_expression'|> additive_expression relational_expression'|!= additive_expression relational_expression'|== additive_expression relational_expression'|= additive_expression relational_expression'|$
additive_expression->multiplicative_expression additive_expression'
additive_expression'->+ multiplicative_expression additive_expression'|- multiplicative_expression additive_expression'|++|--|$
multiplicative_expression->postfix_expression multiplicative_expression'|DIGIT multiplicative_expression'|FRACTION multiplicative_expression'
multiplicative_expression'->* postfix_expression multiplicative_expression'|/ postfix_expression multiplicative_expression'|$
postfix_expression->primary_expression postfix_expression'
postfix_expression'->[ expression ]|$
pe'->$|const_list
primary_expression->ID|( expression )|DIGIT|FRACTION|CHARACTER
const->DIGIT|FRACTION|CHARACTER
const_list->const const_list'
const_list'->, const const_list'|$
本Markdown編輯器使用StackEdit修改而來,用它寫博客,將會帶來全新的體驗哦:
- Markdown和擴展Markdown簡潔的語法
- 代碼塊高亮
- 圖片鏈接和圖片上傳
- LaTex數學公式
- UML序列圖和流程圖
- 離線寫博客
- 導入導出Markdown文件
- 豐富的快捷鍵
快捷鍵
- 加粗
Ctrl + B
- 斜體
Ctrl + I
- 引用
Ctrl + Q
- 插入鏈接
Ctrl + L
- 插入代碼
Ctrl + K
- 插入圖片
Ctrl + G
- 提升標題
Ctrl + H
- 有序列表
Ctrl + O
- 無序列表
Ctrl + U
- 橫線
Ctrl + R
- 撤銷
Ctrl + Z
- 重做
Ctrl + Y
Markdown及擴展
Markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成格式豐富的HTML頁面。 —— [ 維基百科 ]
使用簡單的符號標識不同的標題,將某些文字標記爲粗體或者斜體,創建一個鏈接等,詳細語法參考幫助?。
本編輯器支持 Markdown Extra , 擴展了很多好用的功能。具體請參考Github.
表格
Markdown Extra 表格語法:
項目 | 價格 |
---|---|
Computer | $1600 |
Phone | $12 |
Pipe | $1 |
可以使用冒號來定義對齊方式:
項目 | 價格 | 數量 |
---|---|---|
Computer | 1600 元 | 5 |
Phone | 12 元 | 12 |
Pipe | 1 元 | 234 |
定義列表
- Markdown Extra 定義列表語法:
- 項目1
- 項目2
- 定義 A
- 定義 B
- 項目3
- 定義 C
-
定義 D
定義D內容
代碼塊
代碼塊語法遵循標準markdown代碼,例如:
@requires_authorization
def somefunc(param1='', param2=0):
'''A docstring'''
if param1 > param2: # interesting
print 'Greater'
return (param2 - param1 + 1) or None
class SomeClass:
pass
>>> message = '''interpreter
... prompt'''
腳註
生成一個腳註1.
目錄
用 [TOC]
來生成目錄:
數學公式
使用MathJax渲染LaTex 數學公式,詳見math.stackexchange.com.
- 行內公式,數學公式爲:
Γ(n)=(n−1)!∀n∈N 。 - 塊級公式:
更多LaTex語法請參考 這兒.
UML 圖:
可以渲染序列圖:
或者流程圖:
離線寫博客
即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用瀏覽器離線存儲將內容保存在本地。
用戶寫博客的過程中,內容實時保存在瀏覽器緩存中,在用戶關閉瀏覽器或者其它異常情況下,內容不會丟失。用戶再次打開瀏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。
博客發表後,本地緩存將被刪除。
用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換瀏覽器或者清除緩存,內容也不會丟失。
注意:雖然瀏覽器存儲大部分時候都比較可靠,但爲了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱。
瀏覽器兼容
- 目前,本編輯器對Chrome瀏覽器支持最爲完整。建議大家使用較新版本的Chrome。
- IE9以下不支持
- IE9,10,11存在以下問題
- 不支持離線功能
- IE9不支持文件導入導出
- IE10不支持拖拽文件導入
- 這裏是 腳註 的 內容. ↩