编译原理语义分析实验C语言,实验1-3《编译原理》词法分析程序设计方案

《实验1-3《编译原理》词法分析程序设计方案》由会员分享,可在线阅读,更多相关《实验1-3《编译原理》词法分析程序设计方案(5页珍藏版)》请在人人文库网上搜索。

1、实验1-4 编译原理S语言词法分析程序设计方案一、实验目的了解词法分析程序的两种设计方法:1.根据状态转换图直接编程的方式;2.利用DFA编写通用的词法分析程序。二、实验内容1根据状态转换图直接编程编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。具体任务有:(1)组织源程序的输入(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件(3)删除注释、空格和无用符号(4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。(5)对于普通标识符和常量。

2、,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。常量表结构:常量名,常量值2编写DFA模拟程序算法如下:DFA(S=S0,MOVE,F,ALPHABET)/*S为状态,初值为DFA的初态,MOVE为状态转换矩阵,F 为终态集,ALPHABET 为字母表,其中的字母顺序与MOVE 中列标题的字母顺序一致。*/Char Wordbuffer10=“”/。

3、单词缓冲区置空Nextchar=getchar();/读i=0;while(nextchar!=NULL)/NULL代表此类单词 if (nextchar!ALPHABET) ERROR(“非法字符”),return(“非法字符”);S=MOVESnextchar /下一状态if(S=NULL)return(“不接受”);/下一状态为空,不能识别,单词错误wordbufferi=nextchar ; /保存单词符号i+;nextchar=getchar();Wordbufferi=0;If(SF)return(wordbuffer); /接受Else return(“不接受”);该算法要求:实。

4、现DFA算法,给定一个DFA(初态、状态转换矩阵、终态集、字母表),调用DFA(),识别给定源程序中的单词,查看结果是否正确。三、实验要求1能对任何S语言源程序进行分析在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。2能检查并处理某些词法分析错误词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。本实验要求处理以下两种错误(编号分别为1,2):1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。2:源程序文件结束而注释未结束。注释格式为:/* */四、。

5、保留字和特殊符号表单词代码123456789单词intcharfloatvoidconstforifelsethen单词助记符intcharfloatvoidconstforifelsethen内码值-单词代码101112131415161718单词whileswitchbreakbeginend标识符数字(包括整数和实数)单词助记符whileswitchbreakbeginendid num内码值-在符号表中的位置在常数表中的位置单词代码192021222324252627单词+-*/%()单词助记符+-*/%()内码值-单词代码28303536单词=!=%;单词助记符rlop%;内码值=!。

6、=-单词代码373839404142434445单词/=+=-=*=%=|&!=单词助记符/=+=-=*=%=orandnot=内码值-单词的构词规则:字母=A-Za-z数字=0-9标识符=(字母|_)(字母|数字)*数字=数字(数字)*(.数字+|e)四、S语言表达式和语句说明1算术表达式:+、-、*、/、%2关系运算符:、=、)9Error函数:输出错误信息到屏幕10除此之外,还可以设置查符号表,填写符号表等函数,学生可自行设计。六、实验过程说明1每人单独完成。2完成后,由老师验收,并给出成绩。3实验完成后,写出实验报告(要求交打印稿)。报告内容要求如下:完成人:班级、学号、姓名一、实验名。

7、称:简化S语言词法分析器二、实验目的:通过手工编写简化C语言词法分析器,熟悉并深入理解编译程序词法分析器的工作原理。三、实验内容:1根据保留字和特殊符号表能区分出源文件中的保留字、普通标识符和特殊符号,并能进行简单的错误处理。2设计词法分析器模块调用结构图和各模块流程图。3程序源代码。4程序的执行结果:输入文件,输出结果文件及屏幕信息。四、实验中出现的问题及解决方法。五、体会、意见或建议。七、实验时间地点安排共提供3次课上机时间,如上课不能完成,课下自行解决时间、地点: 第4周 周三1单元 软二周五2单元 软一第5周 周三1单元 软二八、测试源程序示例:/aa.cvoid aa( )beginfloat rate,circle; rate=3;circle=3.14*rate*rate;end输出结果:(1)输出结果文件:(void,-)(id, 0) (,-) (),-) (begin,- ) ( float,-) (id,1)(2)标识符的符号表:Name type address0aa1rate2circle345(3)常数表:Name value 0313.1423。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
语法分析是编译原理中的重要部分,它的作用是将词法分析阶段得到的词法单元序列转换成抽象语法树(AST)或语法分析树(Parse Tree),以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。在本次实验中,我们将使用Java语言实现一个简单的语法分析器。 实验要求: 1. 实现自顶向下的递归下降分析器。 2. 支持的文法如下: ``` <program> ::= <stmts_list> <stmts_list> ::= <stmt> | <stmts_list> <stmt> <stmt> ::= <if_stmt> | <while_stmt> | <assign_stmt> <if_stmt> ::= if <condition> then <stmts_list> end <while_stmt> ::= while <condition> do <stmts_list> end <assign_stmt> ::= <id> = <expr> <condition> ::= <expr> <relop> <expr> <expr> ::= <term> | <expr> <addop> <term> <term> ::= <factor> | <term> <mulop> <factor> <factor> ::= <id> | <number> | '(' <expr> ')' <relop> ::= '<' | '>' | '=' | '<=' | '>=' | '<>' <addop> ::= '+' | '-' <mulop> ::= '*' | '/' <id> ::= <letter> | <id> <letter> | <id> <digit> <number> ::= <digit> | <number> <digit> <letter> ::= A | B | ... | Z | a | b | ... | z <digit> ::= 0 | 1 | ... | 9 ``` 注意:文法中的关键字 if、then、end、while、do、and 等均为保留字。 3. 实现的语法分析器应具备以下功能: - 能够识别出语法正确的程序,并输出相应的语法分析树或抽象语法树。 - 能够识别出语法错误的程序,并给出相应的错误提示信息。 - 能够处理注释和空格等无意义的字符。 4. 实验提交要求: - 实验报告,包括程序设计实验结果分析。 - 程序源代码。 实验设计思路: 1. 根据给定的文法,设计语法分析器的语法规则和对应的产生式。 2. 编写相应的Java代码,将文法转换为递归下降分析器所需要的形式。 3. 实现从输入的源代码中读取词法单元序列的功能。 4. 实现递归下降分析器的核心算法,对输入的词法单元序列进行语法分析,并构建相应的语法分析树或抽象语法树。 5. 在语法分析过程中,需要处理注释和空格等无意义的字符,以便于正确识别语法错误。 6. 在语法分析过程中,需要对输入的源代码进行错误检查,并给出相应的错误提示信息。 7. 输出语法分析树或抽象语法树,以便于后续的语义分析、中间代码生成和目标代码生成等环节的进行。 实验结果分析: 经过实验测试,我们的语法分析器能够正确地识别出合法的程序,并输出相应的语法分析树或抽象语法树。同时,它也能够正确地识别出语法错误的程序,并给出相应的错误提示信息。总的来说,本次实验取得了较好的实验效果。 实验源代码: 见下方代码框:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值