1. 程式人生 > >遞迴下降語法分析程式的設計與實現

遞迴下降語法分析程式的設計與實現

一、實驗目的:

加深對語法分析器工作過程的理解;加強對遞迴下降法實現語法分析程式的掌握;能夠採用一種程式語言實現簡單的語法分析程式;能夠使用自己編寫的分析程式對簡單的程式段進行語法翻譯。

二、實驗內容:

在實驗1的基礎上,用遞迴下降分析法編制語法分析程式,語法分析程式的實現可以採用任何一種程式設計工具。

三、實驗要求:

1. 對語法規則有明確的定義;

2. 編寫的分析程式能夠進行正確的語法分析;

3. *對於遇到的語法錯誤,能夠做出簡單的錯誤處理,給出簡單的錯誤提示,保證順利完成語法分析過程;

4. 實驗報告要求用文法的形式對語法定義做出詳細說明,說明語法分析程式的工作過程,說明錯誤處理的實現*。

四、實驗步驟:

1. 定義目標語言的語法規則;

2. 根據語法規則輸入語句段,用遞迴下降分析的方法進行語法分析,直到結束;

3. *對遇到的語法錯誤做出錯誤處理。

五、實驗內容:

1.程式設計實現給定文法的遞迴下降分析程式。

                             E→T|E+T

                                  T→F|T*F

                                  F→(E)|i

2.對文法先進行消除左遞迴。

3.分析程式由一組遞迴過程組成,文法中每個非終結符對應一個過程幾個全域性過程和變數:

ADVANCE,把輸入串指示器IP指向下一個輸入符號,即讀入一個單字元號

SYM,IP當前所指的輸入符號

ERROR,出錯處理子程式

每個非終結符有對應的子程式的定義,首先在分析過程中,當需要從某個非終結符出發進行展開(推導)時,就呼叫這個非終結符對應的子程式。

4. 具體實現時:

(1)當遇到終結符,編寫: if(當前讀到的輸入符號=i)

                             讀入下一個輸入符號

(2)當遇到非終結符E時,編寫語句: 呼叫E()

(3)當遇到E-->e 編寫語句 if(當前讀到的輸入符號不屬於Follow(E))

         Error();

(4)當某個非終結符的規則有多個候選式時,按LL(1)文法的條件能唯一的選擇一個候選式進行推導。

 #include<iostream>

using namespace std;

 chara[80];    // 字串的存入

charsym;      // 單個的判斷字元

inti=0;       // 字串下標

 voidE();      // 功能識別函式

voidE2();     // 功能識別函式

voidT();      // 功能識別函式

voidT2();     // 功能識別函式

voidF();      // 功能識別函式

void input();   // 輸入函式

void advance(); // 字串小標進一函式

 。。。。。。。。


#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>
 
char a[50] ,b[50],d[200],e[10];
char ch;
int n1,i1=0,flag=1,n=5;
int total=0;

int E();
int E1();
int T();
int G();
int S();
int F();

void input();
void input1();
void output();
 
voidmain()                     
{
      int f,p,j=0;
      char x;
   d[0]='E';
   d[1]='=';
   d[2]='>';
   d[3]='T';
   d[4]='G';
   d[5]='#';
   printf("請輸入字串(長度<50,以#號結束)n");
    do{
             scanf("%c",&ch);
             a[j]=ch;
             j++;
   }while(ch!='#');
     n1=j;
      ch=b[0]=a[0];
      printf("步驟t文法t分析串tt分析字元t剩餘串n");
      f=E1();
      if (f==0) return;
      if (ch=='#') 
      {
        printf("acceptn");      
        p=0;
        x=d[p];
             while(x!='#') {
                    printf("%c",x);p=p+1;x=d[p];         
             }
      }else {
             printf("errorn");
        

相關推薦

下降語法分析程式的設計實現

一、實驗目的: 加深對語法分析器工作過程的理解;加強對遞迴下降法實現語法分析程式的掌握;能夠採用一種程式語言實現簡單的語法分析程式;能夠使用自己編寫的分析程式對簡單的程式段進行語法翻譯。 二、實驗內容: 在實驗1的基礎上,用遞迴下降分析法編制語法分析程式,語法分析程式的實現

編譯原理--下降語法分析原始碼(C Language)

    花了一晚上寫的編譯原理作業,遞迴下降語法分析,實現'i'字元進行的+ - * / 操作,錯誤跳出(未完善錯誤提示),語法分析過程.  現把源程式貼出來,時間倉促,難免有錯誤請給與指正.   執行,例如輸入:i+i#                           

編譯原理_下降語法分析(源程式)

一、實驗目的: 編制一個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。 利用C語言編制遞迴下降分析程式,並對簡單語言進行語法分析。 二、實驗原理       1.待分析的簡單語言的語法       2.用擴充的BNF表示如下:          

下降語法分析實驗

一、實驗目的 通過設計、開發一個高階語言的遞迴下降語法分析程式,實現 對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加 深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。 二、實驗要求 (1)理解語法分析在編譯程式中的作用,以及它與詞

反彙編演算法介紹和應用——下降演算法分析

上一篇博文我介紹了Windbg使用的線性掃描(linear sweep)反彙編演算法。本文我將介紹IDA使用的遞迴下降(recursive descent)反彙編演算法。(轉載請指明來源於breaksoftware的csdn部落格)       &

【龍書筆記】用Python實現一個簡單數學表示式從中綴到字尾語法的翻譯器(採用下降分析法)

上篇筆記介紹了語法分析相關的一些基礎概念,本篇筆記根據龍書第2.5節的內容實現一個針對簡單表示式的字尾式語法翻譯器Demo。 備註:原書中的demo是java例項,我給出的將是邏輯一致的Python版本的實現。在簡單字尾翻譯器程式碼實現之前,還需要介紹幾個基本概念。1. 自

編譯原理:語法分析1-下降

要求: 使用的文法如下: E →TE’ E → + TE’ | ε T → FT’ T →* FT’ | ε F → (E) | id 對於任意給定的輸入串(詞法記號流)進行語法分析,遞迴下降方法實現。 要有一定的錯誤處理功能。即對錯誤能提示,並且

下降語法分析

#include <stdio.h> #include <string.h> #include <conio.h> char prog[80],token[6]; char ch; int syn,p,m,n,sum,kk = 0; c

二叉樹後序遍歷()演算法及C語言實現

二叉樹後序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成後,才訪問該節點元素。 圖 1 二叉樹   如圖 1 中,對此二叉樹進行後序遍歷的操作過程為: 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點); 遍歷節點 2 的左子樹(以節點 4 為根

詳解下降分析

通過一個具體的例子來學習遞迴下降分析法。 假設有文法: E -> TE` E` -> +TE` | -TE` | ε T -> FT` T` -> *FT` | /FT` | ε F -> (E) | i 現在希望用遞迴下降的方式寫

【深度學習】6:RNN神經網路原理、MNIST資料集實現數字識別

前言:自己學習研究完CNN卷積神經網路後,很久的一段時間因為要完成自己的畢業設計就把更新部落格給耽擱了。瞎忙了這麼久,還是要把之前留的補上來。因為“種一棵樹最好的時間是在十年前,其次就是現在!” –—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—

的效能分析經典運用

1.遞迴慢的原因? 大家都知道遞迴的實現是通過呼叫函式本身,函式呼叫的時候,每次呼叫時要做地址儲存,引數傳遞等,這是通過一個遞迴工作棧實現的。具體是每次呼叫函式本身要儲存的內容包括:區域性變數、形參、呼叫函式地址、返回值。那麼,如果遞迴呼叫N次,就要分配N*區域性變數、N*

一些利用思想的簡單程式設計題(JS實現

1. 使用遞迴函式計算1+2+...100的值。2. 定義函式,宰相的麥子:相傳古印度宰相達依爾,是國際象棋的發明者。   有一次,國王因為他的貢獻要獎勵他,問他想要什麼。   達依爾說:“只要在國際象棋棋盤上(共64格)擺上這麼些麥子就行了:   第一格一粒,第二格兩粒,…

下降實現計算表示式

Expression.h #ifndef EXPRESSION_H #define EXPRESSION_H /////////////////////////////////////////////////////////////////// /////

_演算法分析_指導性介紹

    遞迴演算法也即自身呼叫自身的演算法, 通常呼叫自身是為求解規模更小的子問題, 但是每次遞迴呼叫編譯器都要為之分配獨立的記憶體空間(主要是棧空間). 通常如果能用迴圈求解, 那麼不應使用遞迴, 因為遞迴在執行效率方面往往低於迴圈, 但是遞迴和迴圈均為一種強大的程式設計工

[linux]二叉樹的建立及其遍歷(C語言實現)

基礎知識 二叉樹的特點: 每一個節點最多有兩棵子樹,所以二叉樹中不存在度大於2的節點,注意,是最多有兩棵,沒有也是可以的 左子樹和右子樹是有順序的,次序不能顛倒,這點可以在哈夫曼編碼中體現, 順序不同編碼方式不同 -即使樹中某個節點中只有一個子樹的花,也要區分它是左子樹還是右子樹

二分查詢、快速排序、呼叫的分析

常見的基礎演算法,相信大家見過很多。接下來我來分析下二分查詢、和快速排序演算法。 二分查詢: 前提是在已經排好序的陣列中,通過查詢的元素與中間元素索引值對應的元素進行比較,若大於中間索引值的元素,則向陣列右半部分查詢元素。依次類推,直到找到為止;找不到就返回一個負數; 二分查詢的時間複雜

(recursion)演算法二叉樹(1)

筆者按:曾經剛開始學習資料結構和演算法時,總會為簡潔雋永的遞迴程式碼而驚歎,也想寫出如此優雅的程式碼,但是思考過程真的實屬不易!!!那時候遞迴都會盡量用顯式棧來規避。 生活中的遞迴!        首先,對遞迴要有一個類似盜夢空間或者平行世界的認識,就

二叉樹的先序遍歷(和非)、中序遍歷(和非)、後序遍歷(非)及層次遍歷java實現

二叉樹的先序遍歷,遞迴實現: public List<Integer> preorderTraversal(TreeNode root) { //用棧來實現 List<Integer> list = new ArrayList&l

兩個經典問題:算瓶蓋約瑟夫環

但凡遞迴,大部分都是兩句話能搞定的,先確定遞迴停止條件,向外翻轉,再確定迴圈條件,向內遞進 if(xx) return xx; return  def(xx...); 首先是算瓶蓋,一百元買啤酒,五元一瓶,三個換一瓶,兩個瓶身換一瓶,求最後總數: 首先,確定條件: