摘要:
参考资料 https://gamma.cs.unc.edu/ORCA/publications/ORCA.pdf https://gamma.cs.unc.edu/RVO2/ 数学知识 1.向量的点乘 dotProduct,计算方法:1. 2., 作用:点积如果为负,则a,b形成的角为钝角;如果为零 阅读全文
摘要:
没有赋值的变量可以直接使用,缺点:变量名错误不易发现 前面实现了简单的计算器,在动作中直接计算 下面一步一步实现一个语言 1.变量 (只能由英文构成) 2.数字 (int) 2.赋值表达式 3.加法表达式 4.语句 语法定义 S' -> S S -> L//语句集合 L -> L T// 语句集合 阅读全文
摘要:
上一篇中实现的First函数没有考虑左递归,在这对此说明和实现 1.立即左递归 A -> Ab|a 1.两步或两步以上产生的左递归 A -> Bc|a B -> Ab|d 前面的实现中,递归用first函数 public Set<Terminal> first(List<Symbol> tokens 阅读全文
摘要:
前面已经在语法分析过程中实现的语法分析树的构造 接下来,遍历语法分析树,并且加入动作 1.需要解决的问题 1)怎么加入动作,怎么方便的动态加入,简单表达 一个产生式样式如:E -> E + T,用符号作为分割符,0E1+2T3,4个位置加入Translator 动作的接口实现 public inte 阅读全文
摘要:
语法制导的实现可以有很多中,如后缀翻译方案,L属性定义的SDT,遍历语法分析树 这里选择使用语法分析树来实现,即 1.建立一棵语法分析树 2.按照从左到右的深度优先顺序执行动作 3.产生式体中的动作在它左边的所有文法符号都被匹配之后立刻执行 这样选择的理由是,非常通用任何SDT都可以实现 一、首先改 阅读全文
摘要:
语法制导定义 Syntax-Directed Definition,SDD 语法制导的翻译 Syntax-Directed Translation,SDT 基本知识 通过向一个文法的产生式附加一些规则或程序片段 1.继承属性 inherited 父结点、本身、兄弟结点 2.综合属性 synthesi 阅读全文
摘要:
LR语法分析器 组成:一个输入,一个输出,状态栈,驱动程序,语法分析表 注意:规约后需要寻找新的符号在栈顶状态上的转换 例如: 状态栈 符号栈 输入 0 5 $id *id$ 此时需要按F -> id规约 0 3 $F *id$ 3是规约的新符号F在栈顶状态0上的转换 代码实现 /** * P159 阅读全文
摘要:
语义动是一个C语句的序列 $$ 表是和相应产生式头的非终结符号关联的属性值 $i 表示和相应产生式体中第 i 个文法符号(终结符或非终结符号)关联的属性值 按照产生式规约时会执行关联的语义动作 对于体中只包含一个文法符号的产生式,默认语义动作就是拷贝属性值 阅读全文
摘要:
LALR语法分析表 1.LALR(向前看-LR)技术 2.在实践中常用,分析表比规范LR分析表小 LALR(1)项集族的内核的高效计算方法 1.构造G的LR(0)项集族的内核 2.确定自发生的符号 3.不断扫描所有项集的内核项,添加传播的符号 向前看符号的类型 public static class 阅读全文
摘要:
前面已经实现了SLR语法分析表,但是可能会出现即使语法不是二义性文法,也存在移入/规约冲突 状态 i 包含项[A ->α ],当状态 i 出现在栈顶时,栈中的可行前缀时βα且在任何最后句型中a都不可能跟在βA之后, 那么当输入a时不应该A->α进行规约 为了解决这个问题, 引入更强大的构造语法分析表 阅读全文