求编译原理的词法分析器源码

如题所述

第1个回答  2011-10-14
/* 我上编译原理课时的第一次作业就是这个,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语言)
include "string.h" \/*定义字符串库函数*\/ include "conio.h" \/*提供有关屏幕窗口操作函数*\/ include "ctype.h" \/*分类函数*\/ char prog[80]={'\\0'},token[8]; \/*存放构成单词符号的字符串*\/ char ch;int syn, \/*存放单词字符的种别码*\/ n,sum, \/*存放整数型...

编译原理简单吗
第一步. 词法分析 当代码从文件中被读入到编辑器时,将会进行词法分析 示例中的代码最终会转换为(下面为伪代码)1 ADD 2 ADD 3 第二步. 语法分析 这一步编译器将会把词法分析的结果转换成AST(abstract syntax tree, 抽象语法树)所有的操作数将会作为子节点,所有的操作符将会作为父节点。(不知道的...

编译原理 (4) 词法分析
词法分析是程序编译过程中的首要步骤,其目标是将源代码的字符序列转化为一系列可识别的元素,如标识符、常量等。这些元素通常表示为二元组,例如:const pi = 3.14159; 分析为:(id, E), (assign_op, =>, id, M), (mult_op, *), (id, C), (exp_op, **), (number, 2)词法分析器...

求C语言编译原理语法分析程序
include <iostream> using namespace std;define m 45 define n 100 define t 10 int main(){ FILE *fp;char filename[20],c[n];printf("Type the file name which you want to open:");scanf("%s",&filename);fp=fopen(filename,"r+"); \/*以r-只读方式打开指定文件*\/ if((fp...

编译原理及步骤有哪些呢?
但并不改变程序的执行结果。最后,编译器生成目标代码,如机器语言或字节码。此阶段包括目标代码生成和链接,以创建可执行文件或库。总结来说,编译原理涉及词法分析、语法分析、语义分析、优化以及目标代码生成等多个步骤,其目标是将源代码转换为可执行代码,确保程序的正确性与高效性。

编译原理实战课---词法分析
词法分析的过程,其实就是对一个字符串进行模式匹配的过程 词法分析器 词法分析器生成工具 lex(及 GNU 版本的 flex)能够基于规则自动生成词法分析器。DFA 它是“Deterministic Finite Automaton”的缩写,即确定的有限自动机。它的特点是:该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态...

编译器有哪几部分构成.编译原理
1. 词法分析 词法分析器根据词法规则识别出源程序 中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器 的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的...

编译原理中的词法分析器的输入与输出是什么?
编译原理中的词法分析器的输入是源程序,输出是识别的记号流。词法分析器编制一个读单词的程序,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符和分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续...

简述内容页的编译原理
语法分析:语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确。语义分析:语义分析的一个工作时进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。中间代码生成...

...求编译原理课程设计---c语言实现c-的语法分析,在线等
语法分析结果如下:(以四元式形式输出)( +, 6, 3, t1)( *, 7, t1, t2)( +, 1, t2, t3)( =, t3, __, a)( =, 1, __, b)\/\/提供一个编译原理的语义分析程序 你可以直接复制 用TC进行调试 include "stdio.h"include "string.h"include <malloc.h> include <conio.h> i...

相似回答