#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","procedure","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=0j<47j++){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=0j<21j++){ //判断是否关键字
int t=strcmp(str,ktt[j])
if(t==0) {
stringstream ss
ste+="|"
ss<<stess<<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=34j<38j++){
int t=strcmp(str,ktt[j])
if(t==0) {
stringstream ss
ste+="|"
ss<<stess<<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=23j<47j++){
int t=strcmp(str,ktt[j])
if(t==0) {
stringstream ss
ste+="|"
ss<<stess<<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
}
还有运行效果图,和实验报告 ,你要的话留下邮箱
这个是编译原理的扒让课程设计吧, 做词法分析这个题目算是最简单的了
只需输入合法词的正则表达式,就可以输出一个确定有限状态自动机(DFA),而DFA的表现形式,往往是一张分析表。
有了词法分销消析器的自动生成器,则可以避免繁琐的单词识别程序,直接对照分亏此知析表即可得出yes or no,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)