當前位置:首頁 » 操作系統 » 詞法分析器源碼

詞法分析器源碼

發布時間: 2022-05-01 16:55:52

Ⅰ 簡易c語言詞法分析器的設計與實現。求源代碼

這個是編譯原理的課程設計吧, 做詞法分析這個題目算是最簡單的了

  • 只需輸入合法詞的正則表達式,就可以輸出一個確定有限狀態自動機(DFA),而DFA的表現形式,往往是一張分析表。

  • 有了詞法分析器的自動生成器,則可以避免繁瑣的單詞識別程序,直接對照分析表即可得出yes or no,

Ⅱ vb.net 詞法分析器源代碼+編譯器源代碼,謝謝

其實就是相當於寫了一個字典而已,把vb.net中的關鍵字和自定義的變數名稱寫成一個字典,在需要的時候可以自動關聯出來。
編譯器的代碼是通用的。
這些都是vs自身完成的功能。

Ⅲ 求一個C語言詞法分析器源代碼。要求:輸入一個.c的源程序,輸出該程序中所有變數。

首先做一個字元串數組
char *keyword[] 裡面放入所有數據類型關鍵字,int,double什麼的。
然後一行一行處理,找裡面的關鍵字,找到以後順序往後找,將空格,逗號,等號作為間隔符。將分號作為結束標志。
等號後面到下一個逗號或者分號之間的都忽略掉,如果有括弧(大中小),到下一個括弧之間的都忽略掉。
如果是long,unsigned,繼續分析後面是不是int。
基本就ok了。你要我幫你寫源碼的話,沒那時間。

Ⅳ 求一個C語言詞法分析器源代碼

我有,這是這學期剛做的,
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool isLetter(char ch){
if ((ch>='A' && ch<='Z') || (ch>='a' && ch<='z')) return true;
else return false;
}

bool isDigit(char ch){
if (ch>='0' && ch<='9') return true;
else return false;
}

bool isP(char ch){
if(ch=='+'||ch=='*'||ch=='-'||ch=='/') return true;
//ch==':'||ch==','||ch=='='||ch==';'||ch=='('||ch==')'
else return false;
}
bool isJ(char ch){
if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')'||ch=='['||ch==']'||ch=='='||ch==':'||ch=='<'||ch=='>'||ch=='{'||ch=='}'||ch=='#') return true;
//
else return false;
}
bool isBlank(char ch){
if(ch==' '||ch=='\t') return true;
else return false;
}

int main(){
string src,ste,s;
char ch0,ch,ch1[2];
char ktt[48][20]={"and","begin","const","div","do","else","end","function","if","integer",
"not","or","procere","program","read","real","then","type","var","while","write","標識符","無符號數",
",",";",":",".","(",")","[","]","..","++","--","+","-","*","/","=","<",">","<>","<="
,">=",":=","{","}","#"};
int pos=0;
FILE *fp;
fp=fopen("d:\\in.txt","r");
ch0=fgetc(fp);
while(ch0!=EOF)
{
//if(ch0!='\t'){src+=ch0;}
src+=ch0;
ch0=fgetc(fp);
}
src+='#';
cout<<src<<endl;
ch=src[pos++];
ste=" ";
for(int j=0;j<47;j++){cout<<j<<ktt[j]<<endl;}
cout<<"詞法分析:\n";
while(ch!='#')
{
char str[20];
if(ch!='\n')
{
if(isDigit(ch))
{ //判斷常數
int i=0;
while(isDigit(ch)||ch=='.')
{
str[i++]=ch;
//i++;
ch=src[pos++];
}
str[i]='\0';
ste=ste+"|"+"22";
cout<<str;
continue;
}
else if(isLetter(ch))
{ //判斷字元
int i=0,j;
while(isLetter(ch)||isDigit(ch))
{
str[i++]=ch;
//i++;
ch=src[pos++];
}
str[i]='\0';
for(j=0;j<21;j++){ //判斷是否關鍵字
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
if(j==21){ste=ste+"|"+"21";}
// cout<<" ";
cout<<str;
continue;
}
else if(isP(ch)){ ///判斷是否運算符
int i=0,j;
str[i++]=ch;
str[i]='\0';
for(j=34;j<38;j++){
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
cout<<str;
ch=src[pos++];
continue;
}
else if(isJ(ch)) //判斷是否界符
{
int i=0,j;
while(isJ(ch))
{
str[i++]=ch;
ch=src[pos++];
}
str[i]='\0';
for(j=23;j<47;j++){
int t=strcmp(str,ktt[j]);
if(t==0) {
stringstream ss;
ste+="|";
ss<<ste;ss<<j;
ss>>ste;
break;
}
}
cout<<str;
continue;
}
else if(isBlank(ch))
{
cout<<ch;
ch=src[pos++];
continue;
}
}
else{
cout<<ste<<endl;
ste=" ";
}
ch=src[pos++];
}
return 0;
}

還有運行效果圖,和實驗報告 ,你要的話留下郵箱

Ⅳ c語言詞法分析器、語法分析器、語義分析器源碼

bison 網上搜以下, 開源的

Ⅵ 做一個簡單的詞法分析器, 一:要求能識別C程序中的部分關鍵字 int, char ,float if,else main, prin

時間:2012-10-30 晚
要求:輸入一串字元串,對其進行詞法分析,並且按照(<種別>,<字元串/數字>)格式進行輸出
種別編碼:
符號 種別 符號 種別 符號 種別
begin 1 + 13 <= 22
if 2 - 14 > 23
then 3 * 15 >= 24
while 4 / 16 = 25
do 5 : 17 ; 26
end 6 := 18 ( 27
l(l|d)* 10 < 20 ) 28
數字① 11 <> 21 # 0
①數字的詞法正規式如下:( +|-|ε ) dd*(.dd* | ε)( e ( +|-|ε ) dd*|ε)
ps:輸入的字元串以「#」結尾
運行環境:VC++6.0
說明:搜索網上的資源,大部分的「數字」部分都是dd*形式,但這次試驗要求的是①形式,因而在數字部分做了很大努力。與dd*形式的不同有三個地方——ch是數字時,ch是+後接著是數字形式,ch是-後接著是數字形式。然而由於水平有限,時間較短,每個「加號」或「減號」後必須要在輸入數字正負符號,否則會默認「+」「-」為正負符號而不是「加號」「減號」。希望能有簡單方法解決這個問題。
源代碼:

#include <stdio.h> //定義I/O庫所用的某些宏和變數
#include <string.h> //定義字元串庫函數
#include <math.h> //定義數學運算符號庫函數
char prog[80],token[8]; //prog:緩沖區;token:一個有意義的字元串
char ch; //ch:當前處理的字元
int syn,p,m,n,f,e;
//syn:類別;p,m,n:計數變數;f,標記數字正負;e,10的次方數
double sum; //sum,數字
char *rwtab[6]={"begin","if","then","while","do","end"};
//基本字表置初值
void main(void) //主函數
{
void scaner(void); //聲明函數
p=0;
printf("\n請輸入字元串:\n");
do{ //輸入的字元放入緩沖區
ch=getchar();
prog[p++]=ch;
}while(ch!='#');
p=0;
do{ //分析詞法並輸出結果
scaner();
switch(syn)
{
case 11:printf("(%2d,%16g)\n",syn,sum);break;
case -1:printf("輸入錯誤\n");break;
default:printf("(%2d,%16s)\n",syn,token);
}
}while(syn!=0);
}
void scaner(void)
{
for(n=0;n<8;n++) //token初始化
token[n]=NULL;
ch=prog[p++];
while(ch==' ') //如果取消空字元(目前空字元只包括空格)
ch=prog[p++];
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
//如果ch是字母字元
{
m=0;
while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
//如果ch是字母字元或數字字元
{
token[m++]=ch;
ch=prog[p++]; //讀下一個字元
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1; //給出syn值
break;
}
}
else if(ch>='0'&&ch<='9') //數字(1)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小數點
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
p--;
syn=11;
}
else switch(ch)
{
case '<':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='>') //<>
{
syn=21;
token[m++]=ch;
}
else if(ch=='=') //<=
{
syn=22;
token[m++]=ch;
}
else //<
{
syn=20;
p--;
}
break;
case '>':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=') //>=
{
syn=24;
token[m++]=ch;
}
else //>
{
syn=23;
p--;
}
break;
case ':':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='=') //:=
{
syn=18;
token[m++]=ch;
}
else //:
{
syn=17;
p--;
}
break;
case '+':
ch=prog[p++];
if(ch>='0'&&ch<='9') //數字(2)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小數點
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
p--;
syn=11;
}
else //+
{
syn=13;
p--;
ch=prog[p-1];
token[0]=ch;
}
break;
case '-':
ch=prog[p++];
if(ch>='0'&&ch<='9') //數字(3)
{
sum=0;
while(ch>='0'&&ch<='9')
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
if(ch=='.') //有小數點
{
e=-1;
ch=prog[p++];
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum+(ch-'0')*pow(10,e--);
ch=prog[p++];
}
}
}
if(ch=='e'||ch=='E') //有e
{
e=0,f=1;
ch=prog[p++];
if(ch=='+')
{
f=1;
ch=prog[p++];
}
else if(ch=='-')
{
f=-1;
ch=prog[p++];
}
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
e=e*10+ch-'0';
ch=prog[p++];
}
}
e=e*f;
sum=sum*pow(10,e);
}
sum=-sum;
p--;
syn=11;
}
else //-
{
syn=13;
p--;
ch=prog[p-1];
token[0]=ch;
}
break;
case '*': syn=15;token[0]=ch;break;
case '/': syn=16;token[0]=ch;break;
case '=': syn=25;token[0]=ch;break;
case ';': syn=26;token[0]=ch;break;
case '(': syn=27;token[0]=ch;break;
case ')': syn=28;token[0]=ch;break;
case '#': syn=0;token[0]=ch;break;
default: syn=-1;
}
}
試試吧

Ⅶ 誰有詞法分析器的源代碼謝謝

// 456.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
bool Isnoshow(char ch){ //判斷是不是空格、回車、換行符
if(ch=='\n'||ch=='\t'||ch==' ')
return true;
return false;
}

bool Isletter(char ch){ //判斷是不是字母
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
return true;
return false;
}
bool Isdigital(char ch){ //判斷是不是數字
if(ch>='0'&&ch<='9')
return true;
return false;
}
bool Isunline(char ch){ //判斷是不是下劃線
if(ch=='_')
return true;
return false;
}
bool Iscacus(char ch){ //判斷是不是運算符
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%'||
ch=='<'||ch=='>'||ch=='&'||ch=='|'||ch=='!'||ch=='=')
return true;
return false;
}
bool Issplits(char ch){ //判斷是不是分界符
if(ch=='{'||ch=='}'||ch=='['||ch==']'||ch=='('||
ch==')'||ch==';'||ch==','||ch=='.'||ch==':'||ch=='"')
return true;
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
char b[1000];
ifstream ifile;
ifile.open("d:\\1.txt");
int i=0;
while(ifile.get(b[i])){

{
int a=i+1;
if(ifile.eof()==1) break;
if(Isletter(b[i])||Isunline(b[i]))
cout<<b[i];
else if(Isnoshow(b[i]))
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是標識符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是數字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是運算符"<<endl;
}
else if(Isdigital(b[i]))
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是標識符"<<endl;
else if(Issplits(b[i-1]))
cout<<b[i-1]<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是運算符"<<endl;
cout<<b[i];
}
else if(Iscacus(b[i]))//運算符
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是標識符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是數字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
cout<<b[i];
}
else if(Issplits(b[i]))//分界符
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是標識符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是數字"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是運算符"<<endl;
cout<<b[i];
}
i++;
}
}
if(b[i]='/0')
{
if(Isletter(b[i-1])||Isunline(b[i-1]))
cout<<"是標識符"<<endl;
else if( Isdigital(b[i-1]))
cout<<"是數字"<<endl;
else if(Issplits(b[i-1]))
cout<<"是分界符"<<endl;
else if(Iscacus(b[i-1]))
cout<<"是運算符"<<endl;

}

ifile.close();
return 0;
}

Ⅷ 怎麼理解token,tokenize,tokenizer.

1、一種解釋

token:令牌
tokenize:令牌化
tokenizer:令牌解析器

2、另一種翻譯是:token可以翻譯為「標記」,tokenize可以翻譯為「標記解析」或「解析標記」,tokenizer可以翻譯為「標記解析器」。

在編寫詞法分析器(Lexer)或語法分析器(Parser)的時候,除了Lexer和Parser這兩個詞會經常使用外,tokenize和tokenizer也會經常出現,基本上所有涉及到詞法解析的源碼都會用到tokenize。

在邱仲潘譯的《Mastering Java 2》有這兒一段:

StreamTokenizer類根據用戶定義的規則,從輸入流中提取可識別的子串和標記符號,這個過程稱為令牌化 ([i]tokenizing[/i]),因為流簡化為了令牌符號。令牌([i]token[/i])通常代表關鍵字、變數名、字元串、直接量和大括弧等 語法標點。

Ⅸ 求編譯原理的詞法分析器源碼

/* 我上編譯原理課時的第一次作業就是這個,flex源碼. */
%{
#include<math.h>
int num_lines=0;
%}
DIGIT [0-9]
ID [a-zA-Z_][a-zA-Z0-9]*
%%
"#include" {
printf("<包含頭文件,請手動合並文件\\>\n");
fprintf(yyout,"<包含頭文件,請手動合並文件\\>\n");
}
{DIGIT}+ {
printf("(3整數, \"%s\")\n", yytext);
fprintf(yyout,"(3整數, \"%s\")\n", yytext);
}
{DIGIT}+"."{DIGIT}* {
printf("(3浮點數, \" %s\")\n",yytext);
fprintf(yyout,"(3浮點數, \" %s\")\n",yytext);
}
auto |
break |
case |
char |
const |
continue |
default |
do |
double |
else |
enum |
extern |
float |
for |
goto |
if |
int |
long |
register |
return |
short |
signed |
sizeof |
static |
struct |
switch |
typedef |
union |
unsigned |
void |
volatile |
while {
fprintf(yyout,"(1, \"%s\")\n",yytext);
fprintf(yyout,"(1, \"%s\")\n",yytext);
}
{ID} {
printf("(2, \"%s\")\n",yytext);
fprintf(yyout,"(2, \"%s\")\n",yytext);
}
"+" |
"++" |
"+=" |
"-" |
"--" |
"-=" |
"->" |
"*" |
"**" |
"*=" |
"/" |
"/=" |
"=" |
"==" |
">" |
">>" |
">=" |
">>=" |
"<" |
"<<" |
"<=" |
"<<=" |
"!" |
"!=" |
"%" |
"%=" |
"&" |
"&&" |
"&=" |
"|" |
"||" |
"|=" |
"^" |
"^=" {
printf("(4, \"%s\")\n",yytext);
fprintf(yyout,"(4, \"%s\")\n",yytext);
}
"{" |
"}" |
"(" |
")" |
";" |
"," |
"'" |
"\"" |
"." |
"?" |
"[" |
"]" |
"\\" |
":" {
printf("(5, \"%s\")\n",yytext);
fprintf(yyout,"(5, \"%s\")\n",yytext);
}
\n {
++num_lines;
}
"/*"[^(*/)\n]*"*/"
(" ")+
[\t]+
. {
printf("(不能識別字元, \"%s\")\n",yytext);
fprintf(yyout,"(不能識別字元, \"%s\")\n",yytext);
}
%%
main(argc,argv)
int argc;
char **argv;
{
++argv,--argc;
if(argc>0)
yyin=fopen(argv[0],"r");
else
yyin=stdin;
yyout=fopen("output.txt","w");
yylex();
fclose(yyout);
}
int yywrap()
{
return 1;
}

/* 附:我們第一次作業的要求。
實驗一:用高級語言編寫詞法分析器(用lex生成)一、實驗目的:編制一個識別C語言子集的詞法分析器。從輸入的源程序中,識別出各個具有獨立意義的記號,即基本保留字、標識符、常數、運算符、分隔符五大類。並依次輸出各個記號的內部編碼及記號符號自身值。(遇到錯誤時可顯示「Error」,然後跳過錯誤部分繼續顯示)二、實驗過程和指導:(一)准備:1.閱讀課本有關章節,明確語言的詞法,寫出基本保留字、標識符、常數、運算符、分隔符和程序例。2.初步編制好程序。3.准備好多組測試數據。(二)程序要求:程序輸入/輸出示例:如源程序為C語言。輸入如下一段:main(){ int a,b; a = 10; b = a + 20;}要求輸出如下:(2,」main」)(5,」(「)(5,」)「)(5,」{「)(1,」int」)(2,」a」)(5,」,」)(2,」b」)(5,」;」)(2,」a」)(4,」=」)(3,」10」)(5,」;」)(2,」b」)(4,」=」)(2,」a」)(4,」+」)(3,」20」)(5,」;」)(5,」)「}
要求(滿足以下要求可獲得70%該題的得分):識別保留字:if、int、for、while、do、return、break、continue其他的都識別為標識符;常數為無符號整形數;運算符包括:+、-、*、/、=、>、<、>=、<=、!=分隔符包括:,、;、{、}、(、)以上為參考,具體可自行增刪。 三、實驗檢查:1.程序:輸入:測試數據(以文件形式);輸出:二元組(以文件形式)。2.實驗報告:(1)功能描述:該程序具有什麼功能?(2)狀態轉換圖。(2)程序結構描述:函數調用格式、參數含義、返回值描述、函數功能;函數之間的調用關系圖、程序總體執行流程圖。(4)源程序代碼。(5)實驗過程記錄:出錯次數、出錯嚴重程度、解決辦法摘要。(6)實驗總結:你在編程過程中花時多少?多少時間在紙上設計?多少時間上機輸入和調試?多少時間在思考問題?遇到了哪些難題?你是怎麼克服的?你對你的程序的評價?你的收獲有哪些?

另可附加:關鍵字 有符號數 符號表填寫 行號記錄,等
*/

熱點內容
魔獸世界退役伺服器有什麼用處 發布:2024-10-05 20:50:00 瀏覽:194
新車配置不符怎麼投訴 發布:2024-10-05 20:49:00 瀏覽:388
編譯的html文件 發布:2024-10-05 20:48:58 瀏覽:161
python自學網站 發布:2024-10-05 20:46:08 瀏覽:19
存儲在rom中的數據當計算機斷電後 發布:2024-10-05 20:43:46 瀏覽:9
炒股編程代碼 發布:2024-10-05 20:29:10 瀏覽:275
防火門報配置錯誤是什麼原因 發布:2024-10-05 20:20:47 瀏覽:886
移動寬頻設置路由器怎麼設置密碼 發布:2024-10-05 20:03:30 瀏覽:105
微指令的編譯方法有哪一些 發布:2024-10-05 19:02:10 瀏覽:887
android離線定位 發布:2024-10-05 18:36:40 瀏覽:861