首页 > 其他分享 > C 语言编写的简单词法分析器 reference.c

C 语言编写的简单词法分析器 reference.c

时间:2023-05-06 17:12:34浏览次数:31  
标签:word reference 分析器 c% 词法 fprintf cp s% out

#include <stdio.h>
#include <string.h>
#define MAX 500 
#ifdef __unix
#define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL
#endif
int main()
{
FILE *in, *out;
char word[MAX]; 
char cp; 
int i;
if (( fopen_s(&in,"in.txt", "r")) != 0)//in=fopen("in.txt","r"))==NULL
{
printf("can not open in.txt! \n");
return 1;
}
else
{
printf("success open in.txt!\n");
}
if ((fopen_s(&out,"out.txt", "w")) != 0)//out = fopen("out.txt", "r")) == NULL
{
printf("Can not open out.txt!\n");
return 0;
}
else
{
printf("Successfully opened out.txt\n");
}
cp = fgetc(in);
while (cp != EOF)
{

while (cp == ' ' || cp == '\t' || cp == '\n')
{
cp = fgetc(in);
}

i = 0;

if (cp >= '0'&&cp <= '9')
{
word[i++] = cp;
cp = fgetc(in);
while (cp >= '0'&&cp <= '9')
{
word[i++] = cp;
cp = fgetc(in);
}
if (cp == ' '||cp=='\t'||cp=='\n'||cp==' = '||cp==' + '||cp==' - '||cp=='*'||cp==' / '||cp=='>'||cp=='<'||cp=='!'||cp=='; '||cp==':'||cp==', '||cp=='{'||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')')
{
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(','"',word,'"',28,')');
}
else
{
while (cp != ' '&&cp!='\t'&&cp!='\n'&&cp!=' = '&&cp!=' + '&&cp!=' - '&&cp!='*'&&cp!=' / '&&cp!='>'&&cp!='<'&&cp!='!'&&cp!= ';'&&cp != ':'&&cp != ','&&cp != '{'&&cp != '}'&&cp != '['&&cp != ']'&&cp != '('&&cp != ')')
{
word[i++] = cp;
cp = fgetc(in);
}
word[i] = '\0';
fprintf(out, "%s%c%s%c%s\n", "error: ", '"', word, '"', " some thing wrong ");
}
continue;
}

if ((cp >= 'a'&&cp <= 'z') || (cp >= 'A'&&cp <= 'Z') || cp == '_')
{
while ((cp >= 'a'&&cp <= 'z') || (cp >= '0'&&cp <= '9') || (cp >= 'A'&&cp <= 'Z') || cp == '_')
{
word[i++] = cp;
cp = fgetc(in);
}
if (cp == ' '||cp=='\t'||cp=='\n'||cp==' = '||cp==' + '||cp==' - '||cp=='*'||cp==' / '||cp=='>'||cp=='<'||cp=='!'||cp=='; '||cp==':'||cp==', '||cp=='{'||cp=='}'||cp=='['||cp==']'||cp=='('||cp==')')
{
word[i] = '\0';
/* 鍩烘湰淇濈暀瀛楁娴?*/
if (strcmp(word, "main") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 1, ')');
else if (strcmp(word, "void") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 2, ')');
else if (strcmp(word, "int") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 3, ')');
else if (strcmp(word, "float") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 4, ')');
else if (strcmp(word, "double") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 5, ')');
else if (strcmp(word, "char") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 6, ')');
else if (strcmp(word, "struct") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 7, ')');
else if (strcmp(word, "const") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 8, ')');
else if (strcmp(word, "extern") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 9, ')');
else if (strcmp(word, "register") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 10, ')');
else if (strcmp(word, "static") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 11, ')');
else if (strcmp(word, "if") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 12, ')');
else if (strcmp(word, "else") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 13, ')');
else if (strcmp(word, "switch") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 14, ')');
else if(strcmp(word, "case") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 15, ')');
else if (strcmp(word, "for") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 16, ')');
else if (strcmp(word, "do") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 17, ')');
else if (strcmp(word, "while") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 18, ')');
else if (strcmp(word, "goto") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 19, ')');
else if (strcmp(word, "continue") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 20, ')');
else if (strcmp(word, "break") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 21, ')');
else if (strcmp(word, "default") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 22, ')');
else if (strcmp(word, "sizeof") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 23, ')');
else if (strcmp(word, "return") == 0)
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 24, ')');
else
fprintf(out, " Custom identifier :%c%c%s%c,%d%c\n", '(', '"', word, '"', 29, ')');
}

else
{
while (cp != ' '&&cp!='\t'&&cp!='\n'&&cp!=' = '&&cp!=' + '&&cp!=' - '&&cp!='*'&&cp!=' / '&&cp!='>'&&cp!='<'&&cp!='!'&&cp!= ';'&&cp != ':'&&cp != ','&&cp != '{'&&cp != '}'&&cp != '['&&cp != ']'&&cp != '('&&cp != ')')
{
word[i++] = cp;
cp = fgetc(in);
}
word[i] = '\0';
fprintf(out, "%s%c%s%c%s\n", "error: ", '"', word, '"', " is not a legitimate identifier ");
}
continue;
}
/* 杩愮畻绗?*/
if (cp == '+')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 31, ')');
cp = fgetc(in);
continue;
}
if (cp == '-')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 32, ')');
cp = fgetc(in);
continue;
}
if (cp == '*')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 33, ')');
cp = fgetc(in);
continue;
}
if (cp == '/')
{
word[i++] = cp;
cp = fgetc(in);
if (cp == '*') { word[--i] = '\0'; while (cp != '/') { cp = fgetc(in); }cp = fgetc(in); }
else
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 34, ')');
word[i] = '\0';
continue;
}
if (cp == '=')
{
word[i++] = cp;
cp = fgetc(in);
if (cp == '=')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 39, ')');
cp = fgetc(in);
}
else
{
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 27, ')');
}
continue;
}
if (cp == '<')
{
word[i++] = cp;
cp = fgetc(in);
if (cp == '=')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 36, ')');
cp = fgetc(in);
}
else
{
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 35, ')');
}
continue;
}
if (cp == '>')
{
word[i++] = cp;
cp = fgetc(in);
if (cp == '=')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 38, ')');
cp = fgetc(in);
}
else
{
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 37, ')');
}
continue;
}
if (cp == '!')
{
word[i++] = cp;
cp = fgetc(in);
if (cp == '=')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 40, ')');
cp = fgetc(in);
}
else
{
word[i] = '\0';
fprintf(out, "%s%c%s%c%s\n", "error: ", '"', word, '"', " is not a legitimate identifier ");
}
continue;
}
/* 鐣岀 */
if (cp == ';')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 41, ')');
cp = fgetc(in);
continue;
}
if (cp == ':')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 42, ')');
cp = fgetc(in);
continue;
}
if (cp == ',')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 43, ')');
cp = fgetc(in);
continue;
}
if (cp == '{')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 44, ')');
cp = fgetc(in);
continue;
}
if (cp == '}')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 45, ')');
cp = fgetc(in);
continue;
}
if (cp == '[')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 46, ')');
cp = fgetc(in);
continue;
}
if (cp == ']')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 47, ')');
cp = fgetc(in);
continue;
}
if (cp == '(')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 48, ')');
cp = fgetc(in);
continue;
}
if (cp == ')')
{
word[i++] = cp;
word[i] = '\0';
fprintf(out, "%c%c%s%c,%d%c\n", '(', '"', word, '"', 49, ')');
cp = fgetc(in);
continue;
}

word[i++] = cp;
cp = fgetc(in);
word[i] = '\0';
fprintf(out, "%s%c%s%c%s\n", "error: ", '"', word, '"', "not a id");
}
fclose(in);
fclose(out);
printf("Success! Please see out.txt\n");
return 0;
}

标签:word,reference,分析器,c%,词法,fprintf,cp,s%,out
From: https://www.cnblogs.com/tangcoder/p/17377974.html

相关文章

  • 一统天下 flutter - 存储: shared_preferences - 用于操作 android 的 SharedPreferen
    源码https://github.com/webabcd/flutter_demo作者webabcd一统天下flutter-存储:shared_preferences-用于操作android的SharedPreferences,ios的NSUserDefaults,web的LocalStorage示例如下:lib\storage\shared_preferences.dart/**shared_preferences......
  • 爬取过程中出现stale element reference: element is not attached to the page docum
    Bug实际情况描述如下:当我想爬取信息类型中的6个元素时,使用这样的1smallClassList=seleniumService.waitFindElements(bidCrawler.getSmallClassTag());2for(WebElementsmallLi:smallClassList){3try{4Thr......
  • 三、词法分析
    词法分析词法分析基于正则文法进行的,即识别的单词是该类文法的句子词法分析的任务是识别单词单词:保留字、标识符、常数、运算符、分界符标识符是语法概念,名字是语义概念词法分析器词法分析器用于识别单词词法分析程序,接受输入的源程序,输出结果是单词的种别编码和单词的......
  • PreferenceActivity详解
    为了引入这个概率首先从需求说起即:现有某Activity专门用于手机属性设置那么应该如何做呢?根据已学知识很快一个念头闪过即:Activity+Preference组合前者用于界面构建后者用于设置数据存放 其实这是正确的但是这会比较繁琐因为每个设置选项......
  • 《编译原理》第一次实验:词法分析
    该分类为本人在本学期《编译原理》课程上的实验报告,实验对象语言为教学用PL/0语言,实验所用语言为C++。全部报告仅供参考,如有缺漏或错误,烦请指出,Thanks♪(・ω・)ノ一.设计思想根据PL/0语言的文法规范,编写PL/0语言的词法分析程序。1.单词种类及其正规式(1)基本字单词的值单......
  • c语言报错 [Error] invalid initialization of non-const reference of type 'LinkQue
     进行地址传递是出现报错临时值不能作为非常量引用参数进行传递所以需要在main函数中·重新定义指针传递 ......
  • Debug Assertion Failed!:Expression: can't dereference out of range vector iterato
    1#include<iostream>2#include<vector>3usingnamespacestd;4boolFind(inttarget,vector<int>array){5autobegin=array.begin(),end=array.end(),mid=begin+(end-begin)/2;6while((target!=*mid)&&a......
  • 【c&c++】C++ 关于编译出现“undefined reference to `std::cout‘“的问题
    1、问题概述        在使用gcc编译c++代码时会出现undefinedreferenceto`std::cout',如编译如下代码:#include<iostream>usingnamespacestd;intmain(){cout<<"Helloworld!";return0;}然而,gcc下编译出现的问题是: 2、解决方法使用g++编译,g++......
  • 对dubbo的DubboReference.check的参数进行剖析
    背景在使用dubbo的时候,发现当消费者启动的时候,如果提供者没有启动,即使提供者后来启动了,消费者也调不通提供者提供的接口了。注册中心使用都是nacosdubbo版本是3.0.4例子接口publicinterfaceDemoService{StringsayHello();}提供者@DubboServicepublicclassDe......
  • java.lang.IllegalArgumentException: Illegal group reference
    评:在使用String的replaceFirst(regex,replacement)的时候出现java.lang.IllegalArgumentException:Illegalgroup原因是第一个参数支持正则表达式,replacement中出现“$”,会按照$1$2的分组模式进行匹配,当编译器发现“$”后跟的不是整数的时候,就会抛出“非法的组引用”的异常......