基於c語言的語法分析器的實現

一. 總體實現思想

  1. 我採用自頂向下的預測分析技術來實現,其基本方法如下:
    從文法開始符號出發,在每一步推導過程中根據當前句型的最左非終結符A和當前輸入符號a,選擇正確的A-產生式。爲保證分析的確定性,選出的候選式必須是唯一的。

  2. 具體的非遞歸的預測語法分析結構如下所示:
    非遞歸的預測分析不需要爲每個非終結符編寫遞歸下降過程,而是根據預測分析表構造一個自動機,也叫表驅動的預測分析
    預測分析結構圖

  3. 表驅動的預測分析法的算法
    3.1輸入:一個串w和文法G的分析表 M
    3.2輸出:如果w在L(G )中,輸出w的最左推導;否則給出錯誤指示
    3.3方法:最初,語法分析器的格局如下:輸入緩衝區中是wG 。下面的程序使用預測分析表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語言文法設計

  1. c語言基本程序主要是由函數定義組成,故定義文法爲:
program->function_definition program'
program'->function_definition program'|$  //c語言的程序構造
  1. 而函數定義又包括了類型定義、函數聲明、複合聲明,故文法定義爲
function_definition->type_specifier declarator_func                                  compound_statement 
type_specifier->VOID|CHAR|INT|FLOAT //函數定義
  1. 函數聲明又包含函數名字和參數,故文法所以定義爲
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      //聲明說明符
  1. 複合聲明又包括變量聲明、{、}、語句聲明等
compound_statement->{ compound_statement'
compound_statement'->statement_list }|declaration_list statement_list }|}
  1. 變量聲明又包含聲明說明符、,、=,初始化等等
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'|$
  1. 語句聲明包括複合語句聲明、表達式語句聲明、選擇語句聲明、迭代語句(如while)聲明、跳轉語句聲明等
statement_list->statement statement_list'
statement_list'->statement statement_list'|$
statement->compound_statement|expression_statement|selection_statement|iteration_statement|declaration_list|jump_statement
  1. 跳轉語句包括continue、break、return等
jump_statement->CONTINUE ;|BREAK ;|RETURN jump_statement'
jump_statement'->;|expression ;
  1. 選擇語句(分支語句)包括if、else等
selection_statement->IF ( expression ) compound_statement selection_statement'
selection_statement'->ELSE statement|$
  1. 迭代語句包括while、for等等
iteration_statement->WHILE ( expression ) statement|FOR ( expression_statement expression_statement expression ) statement
expression->relational_expression expression'
expression'->, relational_expression expression'|$
  1. 表達式語句包含各種語句的組合,故文法設計如下
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)=(n1)!nN
  • 塊級公式:

x=b±b24ac2a

更多LaTex語法請參考 這兒.

UML 圖:

可以渲染序列圖:

Created with Raphaël 2.1.0張三張三李四李四嘿,小四兒, 寫博客了沒?李四愣了一下,說:忙得吐血,哪有時間寫。

或者流程圖:

Created with Raphaël 2.1.0開始我的操作確認?結束yesno
  • 關於 序列圖 語法,參考 這兒,
  • 關於 流程圖 語法,參考 這兒.

離線寫博客

即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的瀏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用瀏覽器離線存儲將內容保存在本地。

用戶寫博客的過程中,內容實時保存在瀏覽器緩存中,在用戶關閉瀏覽器或者其它異常情況下,內容不會丟失。用戶再次打開瀏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。

博客發表後,本地緩存將被刪除。 

用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換瀏覽器或者清除緩存,內容也不會丟失。

注意:雖然瀏覽器存儲大部分時候都比較可靠,但爲了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱

瀏覽器兼容

  1. 目前,本編輯器對Chrome瀏覽器支持最爲完整。建議大家使用較新版本的Chrome。
  2. IE9以下不支持
  3. IE9,10,11存在以下問題
    1. 不支持離線功能
    2. IE9不支持文件導入導出
    3. IE10不支持拖拽文件導入


  1. 這裏是 腳註內容.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章