资源简介
词法分析是从左向右扫描每行源程序的符号,拼成单词,换成统一的机内表示形式——TOKEN字,送给语法分析程序。
TOKEN字是一个二元式:(单词种别码,自身值)。PL/0语言单词的种别码用整数表示,可参考教材或自行设定;单词自身值按如下规则给出:
(1)标识符的自身值是它在符号表的入口地址。
(2)常数的自身值是常数本身(或它的二进制数值)。
(3)关键字和界限符的自身值为本身。

代码片段和文件信息
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int count;
int judge(char token[10]char procedure[100])
{
int ijkind;
char c;
char *reserve[8] = { “const““main““if““else““while““int““for““return“ };//保留字
for (i = 0; i < 10; i++)//置空
{
token[i] = NULL;
}
c = procedure[count++];
while ((c == ‘ ‘) || (c == ‘\n‘))//排除空格和换行
{
c = procedure[count++];
}
i = 0;
//字母
if (((c <= ‘z‘) && (c >= ‘a‘)) || ((c <= ‘Z‘) && (c >= ‘A‘)))
{
while (((c <= ‘z‘) && (c >= ‘a‘)) || ((c <= ‘Z‘) && (c >= ‘A‘)) || ((c >= ‘0‘) && (c <= ‘9‘)))//次字符是字母或数字
{
token[i++] = c;
c = procedure[count++];
}
kind = 2;
count--;//回退
for (j = 0; j < 8; j++)//检测字符串是否为保留字
{
if (strcmp(token reserve[j]) == 0)
{
kind = 1;
break;
}
}
}
//数字
else if ((c >= ‘0‘) && (c <= ‘9‘))
{
while ((c >= ‘0‘) && (c <= ‘9‘))
{
token[i++] = c;
c = procedure[count++];
}
count--;
kind = 3;
}
//运算符
else if ((c == ‘(‘) || (c == ‘)‘) || (c == ‘{‘) || (c == ‘}‘) || (c == ‘;‘) || (c == ‘‘))
{
token[i++] = c;
kind = 5;
}
//界符、结束标志、错误字符
else
{
switch(c)
{
case‘<‘:
token[i++] = c;
c = procedure[count++];
if (c == ‘=‘)
{
token[i++] = c;
kind = 4;
}
else
{
kind = 4;
count--;
}
break;
case‘>‘:
token[i++] = c;
c = procedure[count++];
if (c == ‘=‘)
{
token[i++] = c;
kind = 4;
}
else
{
kind = 4;
count--;
}
break;
case‘!‘:
token[i++] = c;
c = procedure[count++];
if (c == ‘=‘)
{
token[i++] = c;
kind = 4;
}
else
{
kind = 4;
count--;
}
break;
case‘+‘:
token[i++] = c;
kind = 4;
break;
case‘-‘:
token[i++] = c;
kind = 4;
break;
case‘*‘:
token[i++] = c;
kind = 4;
break;
case‘/‘:
token[i++] = c;
kind = 4;
break;
case‘=‘:
token[i++] = c;
kind = 4;
break;
case‘#‘:
kind = 0;
break;
default:
token[i++] = c;
kind = -1;
break;
}
}
token[i++] = ‘\0‘;
return kind;
}
int main()
{
int kind;
char procedure[100] token[10] ch temp=‘Y‘;
printf(“-----------词法分析器------------\n“);
while (temp == ‘y‘||temp == ‘Y‘)//是否继续
{
count = 0;
printf(“\n请输入一段程序(以“#”结束):\n“);
do {
scanf(“%c“ &ch);
procedure[count++] = ch;
} while (ch != ‘#‘);
getchar();//回车
count = 0;
printf(“\n词法分析结果:\n“);
while (1)
{
kind = judge(token procedure);
if (kind == -1)//检测到错误字符
{
printf(“错误的字符‘%s‘\n“token);
}
else if (kind == 0)//结束标志
{
break;
}
else//输出一条正确的分析结果
{
printf(“( %d, %-6s)\n“ kind token);
}
}
printf(“\n是否继续(Y/N)“);
scanf(“%c“ &temp);
}
system(“pause“);
return 0;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3066 2017-05-06 08:00 word\word.cpp
文件 155105 2018-04-16 14:08 word\word.docx
目录 0 2018-04-16 14:08 word
----------- --------- ---------- ----- ----
158171 3
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
评论
共有 条评论