① 求一個C語言詞法分析器源代碼。要求:輸入一個.c的源程序,輸出該程序中所有變數。
首先做一個字元串數組
char *keyword[] 裡面放入所有數據類型關鍵字,int,double什麼的。
然後一行一行處理,找裡面的關鍵字,找到以後順序往後找,將空格,逗號,等號作為間隔符。將分號作為結束標志。
等號後面到下一個逗號或者分號之間的都忽略掉,如果有括弧(大中小),到下一個括弧之間的都忽略掉。
如果是long,unsigned,繼續分析後面是不是int。
基本就ok了。你要我幫你寫源碼的話,沒那時間。
② 求編譯原理的詞法分析器源碼
/* 我上編譯原理課時的第一次作業就是這個,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)實驗總結:你在編程過程中花時多少?多少時間在紙上設計?多少時間上機輸入和調試?多少時間在思考問題?遇到了哪些難題?你是怎麼克服的?你對你的程序的評價?你的收獲有哪些?
另可附加:關鍵字 有符號數 符號表填寫 行號記錄,等
*/
③ c語言詞法分析器、語法分析器、語義分析器源碼
bison 網上搜以下, 開源的
④ 誰有詞法分析器的源代碼謝謝
// 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;
}
⑤ VS2010環境在一個程序中實現語法分析和詞法分析,求代碼
//一個詞法分析程序,輸入源程序,輸出二元組(詞法記號,屬性值/其在符號表中的位置)構成的序列
#include<iostream>
#include<cstring>
usingnamespacestd;
//char*keywords[6]={"for","if","then","else","while","do"};
intzimu(chara)//分析是否為字母
{
if((a>='a')&&(a<='z'))
return1;
else
return0;
}
intshuzi(chara)
{
if((a>='0')&&(a<='9'))
return1;
else
return0;
}
intbiaodian(chara)
{
if(!zimu(a)&&!shuzi(a))
return1;
else
return0;
}
voidshowstring(char*a)
{
intcount=0;
while(a[count]!='