1. 程式人生 > >簡單詞法分析器的實現

簡單詞法分析器的實現

這是我們的一次程式設計作業,要求用C編寫一個簡單的詞法分析器。要求如下:

編制一個單詞獲取程式,從檔案輸入的源程式中,識別出各個具有獨立意義的單詞,即關鍵字、識別符號、整數、小數、字串、分隔符、運算子等七大類。並依次輸出各個單詞的內部編碼及單詞符號自身文字串(遇到錯誤時可顯示“Error”,然後跳過錯誤部分繼續顯示)。

注意:單詞型別大小寫不敏感(即不區分大小寫)

1、詞法規則

關鍵字: program、const、var、integer、decimal、string、procedure、begin、end 、if、then、else、while、do、call、read、write、not

單詞類別:1

識別符號: 字母或“_”打頭的由字母、數字串或“_”組成的任意長度的符號串。

單詞類別:2

整數:   數字串。

單詞類別:3

小數:   數字串·數字串

單詞類別:4

字串: 由一對“”括起來的任意長度的符號串。注意:可以多行。

單詞類別:5

分隔符: {、}、(、)、;、空格

單詞類別:6

運算子: :=、=、<、<=、>、>=、+、-、*、/

單詞類別:7

2、設計詞法分析函式getToken( ),完成以下功能:

1)getToken( )每呼叫一次就分析出一個單詞;

2)返回單詞類別、單詞自身文字串、單詞在原始檔中的行列號;

3、編寫測試程式,反覆呼叫函式getToken ( ),輸出單詞資訊。

以下是程式碼實現:

注意的事項:

  1,">="這一類操作符要進行判斷。

  2,小數的識別。為了簡便,我把小數當成字串進行處理,後續可以加上一個字串轉數字的程式,或者直接直接識別成小數。

  3,輸入的源程式如何判斷結束,我使用的是"#"字元進行判斷,應該可以通過使用EOF進行識別吧。

  4,超前搜尋指標要回退。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define KW 1 //關鍵字
#define ID 2 //識別符號
#define
INT 3 //整數 #define FLT 4 //小數 #define STR 5 //字串 #define BRK 6 //分隔符 #define OP 7 //操作符 #define WordLen 100 char prog[80],token[WordLen]; char ch; int p,j,syn; int rowNum,lineNum; char *keyword[18] = {"program","const","var","integer","decimal","string","procedure", "begin","end","if","then","else","while","do","call","read","write","not"}; void getToken(){ for(int i = 0;i < WordLen;i++) token[i] = NULL; ch = prog[p++]; /*識別識別符號或者變數名*/ if(ch >= 'a'&&ch <= 'z'||ch == '_'){ int i = 0; while((ch >= '0'&&ch <= '9')||(ch >= 'a'&&ch <= 'z')||ch == '_'){ token[i++] = ch; ch = prog[p++]; } token [i++] = '\0'; p--; syn = ID; for(int n = 0;n < 18 ;n++){ if(strcmp(token,keyword[n]) == 0){ syn = KW; break; } } } /*識別實數*/ else if(ch >= '0' && ch <= '9'){ bool isDouble = false; //是否是小數 j = 0; while(ch>='0'&&ch<='9'){ token[j++] = ch; ch = prog[p++]; } if(ch=='.'){ isDouble = true; token[j++] = ch; ch = prog[p++]; while((ch>='0' && ch<='9')){ token[j++] = ch; ch = prog[p++]; } } if(isDouble){ syn = FLT; } if(!isDouble){ syn = INT; } p--; } /*以下程式碼用於判斷字串*/ else if(ch == '\"'){ j = 0; token[j++] = ch; while(prog[p] != '\"'){ token[j ++] = prog[p++]; } token[j] = prog[p++]; //p--;此處p不回退,因為上個while判斷語句沒有進行超前搜尋。 syn = STR; } /*以下程式碼用於判斷運算子*/ else switch(ch){//其他字元 case'<': j = 0; token[j++] = ch; ch = prog[p++]; if(ch == '='){ token[j++] = ch; syn = OP; } else{ p--; syn = OP; } break; case'>': j = 0; token[j++] = ch; ch = prog[p++]; if(ch == '='){ token[j] = ch; syn = OP; } else{ p--; syn = OP; } break; case':': j = 0; token[j++] = ch; ch = prog[p++]; if(ch == '='){ syn = OP; token[j++] = ch; } else { syn = -1; p--; } break; case '=':syn = OP;token[0] = ch;break; case '+':syn = OP;token[0] = ch;break; case '*':syn = OP;token[0] = ch;break; case '/':syn = OP;token[0] = ch;break; case '{':syn = BRK;token[0] = ch;break; case '}':syn = BRK;token[0] = ch;break; case '(':syn = BRK;token[0] = ch;break; case ')':syn = BRK;token[0] = ch;break; case ';':syn = BRK;token[0] = ch;break; case ' ':syn = BRK;token[0] = ch;break; case '\n':syn = -2;rowNum = 0;break; case '#':syn = 0;break; default :syn = -1;break; } } int main() { //freopen("D:\\compiler.txt","r",stdin); p = 0; lineNum = 1; gets(prog); for(int m = 0;m < sizeof(prog);m++){ if(prog[m] >= 'A'&&prog[m] <= 'Z'){ prog[m] = prog[m] - 'A' + 'a'; } } do { getToken(); rowNum++; switch(syn) { case 1: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token<<")"<<endl;break; case 2: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case 5: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case 6: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token[0]<<")"<<endl; break; case 3: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case 4: cout<<lineNum<<" "<<rowNum<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case -1: cout<<"Error !"<<endl; break; case -2: lineNum = lineNum++;break; case 0:break; } }while(syn != 0); return 0; }

相關推薦

一個簡單詞法分析器的C語言實現

1.1實驗描述 例如:對源程式: begin x:=9: if x>9 then x:=2*x+1/3; end # 的原始檔,經過詞法分析後輸出如下序列: <1,begin><10,x><18,:=><11,9><26,;><

簡單詞法分析器實現

這是我們的一次程式設計作業,要求用C編寫一個簡單的詞法分析器。要求如下: 編制一個單詞獲取程式,從檔案輸入的源程式中,識別出各個具有獨立意義的單詞,即關鍵字、識別符號、整數、小數、字串、分隔符、運算子等七大類。並依次輸出各個單詞的內部編碼及單詞符號自身文字串(遇到錯誤時可顯示

編譯原理c++簡單詞法分析器

 簡單詞法分析程式         編譯原理課程詞法分析程式,自己c++寫的比較簡單功能實現,需要的使用者可以在此基礎上進行自己思路的擴充修改。功能:讀取一個自己設定路徑下的txt檔案中程式碼,然後將分析結果儲存在另外一個自己設定路徑下txt檔案中,下附加程式碼: /*

用C語言實現簡單詞法分析器

詞法分析器又稱掃描器。詞法分析是指將我們編寫的文字程式碼流解析為一個一個的記號,分析得到的記號以供後續語法分析使用。詞法分析器的工作是低級別的分析:將字元或者字元序列轉化成記號.。 要實現的詞法分析器單詞符號及種別碼對照表: 單詞符號 # begin if then wh

編譯原理實驗:實驗一 簡單詞法分析程序設計(必修)(Python實現)

it is 括號 ali 鍵盤輸入 優化 沒有 mce constant 是否 一、實驗目的 了解詞法分析程序的基本構造原理,掌握詞法分析程序的手工構造方法。 二、實驗內容 1、了解編譯程序的詞法分析過程。 2、根據PASCAL語言的說明語句形式,用手工方法構造一個對說明語

編譯原理-詞法分析器1(lex實現)

編譯原理課實驗一是詞法分析器,但是在網上查了很多資料,發現用lex實現還要用Linux,Windows可以用對應的flex實現,但是網上的資料很零散,所以整理了一下從安裝到配置,到實現一個詞法分析器的過程 一、 安裝 開啟安裝好的軟體,選Basic

用python寫一個簡單詞法分析器

編譯原理老師要求寫一個java的詞法分析器,想了想決定用python寫一個。 目標 能識別出變數,數字,運算子,界符和關鍵字,用excel表打印出來。 有了目標,想想要怎麼實現詞法分析器。 1.先進行預處理,把註釋,多餘的空格,空行去掉。 2.一行一行掃

(編譯原理)java實現詞法分析器

1、閒話 最近在學編譯原理,需要用語言實現一個詞法分析器,其實挺簡單的,主要涉及一些語言字串操作處理,如果會正則表示式的話,感覺實現這個會很簡單,但是我並不會啊,然後自己用java實現了,也算是加強了對java的一些字元操作方法的使用。 實現這個分析器,演算法上基本上沒什麼難度,

一個簡單C語言的詞法分析器

一個簡單C語言的詞法分析器 語言的詞法構成: 識別符號 id 同C語言識別符號 常量 num 數字 ch 字元 str 字串 關鍵字 kw_int int kw_char char kw_void void kw_if

Python 實現的 C 語言 詞法分析器

這個學期上了編譯原理課,真的是超難。。。 這門課難到,全院老師只有我們老師他一個人會教編譯原理,哈哈哈哈 這門課這個學期有兩個實驗,一個是寫詞法分析器,一個是寫語法分析器 這裡的詞法分析器是用 Python 寫。Python 是剛自學的,所以使用上應該

C語言源程式詞法分析器(Java實現

一. 介紹 詞法分析器,又稱掃描器,輸入源程式,進行詞法分析,輸出單詞符號。詞法分析僅僅是編譯程式工作中的一部分,編譯程式一般可以劃分為5個階段:詞法分析,語法分析,語義分析與中間程式碼產生,優化,目的碼生成。我們這裡編寫一個簡單的C語言源程式詞法分析器。

LEX & FLEX 實現C語言詞法分析器

最近在學習《編譯原理》,學完詞法分析之後,做了一個C語言的詞法分析器。 詞法分析簡述: 詞法分析是編譯過程的第一步,主要實現高階語言程式中詞法規範的檢查。詞法分析程式的主要任務是按語言的詞法規則從源程式中逐個識別單詞,把字串形式的源程式轉行成單詞串的形式,並把每個單詞轉換

C++實現詞法分析器(學習)

參考網上程式,我把生成的資料存在檔案裡,能分析C語言的源程式 #include<fstream> #include <iostream> #include <stdlib.h> #include <st

實驗二 詞法分析器實現

這裡定義了一個程式語言稱作C-M i n u s (或簡稱為C-),這是一種適合編譯器設計方案的 語言,它比T I N Y語言更復雜,包括函式和陣列。本質上它是C的一個子集,但省去了一些重要 的部分,因此得名。這個附錄由5小節組成。首先,我們列出了語言慣用的

利用LEX實現詞法分析器(vs2010 + Parser Generator版)

對原始碼進行必要的修改        Parser Generator庫的原始檔全部位於“\Parser Generator 2\Cpp\Source”資料夾中,其中共有300多個.c或.cpp檔案。其中一部分需要經過修改才可以通過VS2010的編譯。 (關於這個我的PG版本沒有var.c等檔案,全都是yy

簡單詞法分析器

1、 實驗目的: 設計、編制、除錯一個詞法分析程式,對單詞進行識別和編碼,加深對詞法分析原理的理解。 2、 實驗要求 (1) 允許使用者自己輸入源程式並儲存為檔案 (2) 系統能夠輸出經過預處理後的源程式(去掉註釋、換行、空格等) (3) 能夠將該源程式中所有的單詞根據其

C++實現詞法分析器

color 數字 fseek 數值 als oid namespace keyword The 1 #include <iostream> 2 #include <stdlib.h> 3 #include <stdio.h&

實現指令碼直譯器 - 詞法分析器

本系列介紹 筆者最近正學習編譯原理,為了將理論變為實踐,所以創作了本系列來記錄學習過程中的思考與問題,注意文章中為了理論上描述方便增加了自創的術語。 本系列使用 Java 語言來實現一個指令碼直譯器,該指令碼語言命名為 Foo,其語法參考 JavaScript 語言,本系列程式碼地址 Github 。 詞法分

Java 實現《編譯原理》簡單詞法分析功能

Java 實現《編譯原理》簡單詞法分析功能 簡易詞法分析功能 要求及功能 (1)讀取一個 txt 程式檔案(最後的 # 作為結束標誌,不可省去) { int a, b; a = 10; if(a>=1){ b = a + 20; } } (2)詞法識別分析表 單詞類別|單詞自身值

詞法分析器——哈工大編譯原理課程(一)

mina == 原理 技術分享 after 文件 編碼 exe warn 詞法分析器——哈工大編譯原理課程(一) 程序輸入:從code.txt文件中讀取內容 程序輸出:識別出的單詞序列,格式為:(種別碼,屬性值)      ①對於關鍵字