编译原理实践 hdu
文章平均质量分 56
哇哇哇哇池
这个作者很懒,什么都没留下…
展开
-
实验一:RegExp转NFA
如果当前的优先级小于等于栈顶元素,则退出栈内元素写上,直到栈顶元素的优先级小于该元素,并入栈。//status_new标记当前最新状态编号。,则依次退出栈内元素写上,直到出栈符号为。//当前符号优先级小于等于栈顶优先级元素。//退栈直到当前符号优先级大于栈顶元素。//mid2after 入栈操作。//保存子图的开始状态和结束状态。////test 初始化NFA。//判断是否添加连接符^//pop栈内剩余元素。//后缀表达式转NFA。//且防止空栈的情况。//重新配置全局变量。原创 2024-01-30 08:58:39 · 909 阅读 · 0 评论 -
实验一:NFA转DFA
思路:move(I,alpha)是对于I集合中的每个状态s,面对非空输入符号alpha,能转化到的状态集合,通过求解move(I,alpha)后,我们就能利用之前的e-closure求出e-{move(I,alpha)},也就是状态子集。TIPS:这是非常重要的一步,也是最容易出错的一步,要谨慎考虑。(具体考虑的细节可以在代码中查看,但大体的思路就到这里了,建议看了这段思路后读者自己思考下如何实现,不要马上看代码)e-closure(s)是状态s经由e边可到达的所有状态的集合。1.NFA转DFA原理。原创 2024-01-30 08:56:01 · 380 阅读 · 0 评论 -
实验一:FOLLOW集
如果非终结符后面的符号串的 FIRST 集合包含空串,或者该非终结符是产生式的最后一个符号,则将产生式左侧非终结符的 FOLLOW 集合加入该非终结符的 FOLLOW 集合。*如果非终结符后面是另一个非终结符,则将后者的 FIRST 集合(除去空串)加入前者的 FOLLOW 集合。*遍历每个非终结符的产生式,对于产生式中的每个符号,特别是非终结符,需要更新其 FOLLOW 集合。*如果产生式中的某个非终结符后面紧跟着终结符,则将该终结符加入非终结符的 FOLLOW 集合。//遍历非终结符号*i的产生式。原创 2024-01-30 08:55:14 · 562 阅读 · 0 评论 -
实验一:LL(1)预测分析表设计与实现
如果 FIRST 集合包含空串($),则将产生式左侧非终结符的 FOLLOW 集合也并入 SELECT 集合中,并从 SELECT 集合中移除空串。*例如,如果A->α 的 SELECT 集合包含终结符b,则将α 填入表中M[A][b] 的位置。*对于每个产生式,计算其 SELECT 集合,这个集合决定了在预测分析表中的填充位置。*对于 SELECT 集合中的每个终结符,将产生式填入预测分析表的对应位置。*对于每个产生式,首先计算其首字符串(即产生式右侧)的 FIRST 集合。原创 2024-01-30 08:54:22 · 728 阅读 · 0 评论 -
实验三:借助Flex熟悉SysY词法分析
枚举 TOKEN 定义了各种可能的词法单元类型,例如类型(TYPE)、关键字(KEYWORD)、比较运算符(COMPARISON)、运算符(OPERATOR)、标识符(ID)、常量(CONST)等。为八进制常量、十六进制常量和浮点数定义了模式,并处理了非法八进制和十六进制常量的情况。ID(标识符)匹配以字母或下划线开头,后跟任意数量的字母、数字或下划线的字符串。对于不符合任何已定义模式的字符,词法分析器将其视为错误,并输出相应的错误信息。对于八进制和十六进制常量,执行字符串到数值的转换,并打印转换后的值。原创 2024-01-30 08:52:48 · 397 阅读 · 0 评论 -
实验一:FIRST集
如果第一个符号是非终结符,则需要合并这个非终结符的 FIRST 集合到当前非终结符的 FIRST 集合中。如果该非终结符的 FIRST 集合包含空串(表示为$),则还需考虑下一个符号。*初始化标志位: 函数中有一个flag 标志位,用来检测 FIRST 集合在一轮迭代中是否有更新。*更新检查: 在每次迭代的最后,调用check 函数来进一步更新 FIRST 集合。*如果产生式的第一个符号是终结符,则直接将其加入该非终结符的 FIRST 集合。//flag为1表示first集有更新。原创 2024-01-30 08:51:37 · 1008 阅读 · 0 评论