编程语言实现模式

最新书摘:
  • Smile
    2019-07-15
    Parse类主要字段包括输入流,mark()和release()所使用的记录栈、向前看缓冲区及当前测法单元的下标。对于谓词解析器,只有再ID是类型名的时候才将其当作类型,在type循环中匹配他。
  • Smile
    2019-07-15
    回溯解析器的核心在于对词法单元缓冲区的管理。缓冲区能够提供任意数量的向前看符号,并且支持多层嵌套的标记。
  • Smile
    2019-07-15
    谓词推理就是对布尔表达式进行运行时的判断,以决定是否能使用某个解析选项来匹配,谓词能控制是否使用相关联的解析选项
  • Evan
    2013-11-16
    It’s much more productive to use a DSL specifically designed for describing languages. “Programs” in this DSL are called grammars. Tools that translate grammars to parsers are called parser generators.
  • Evan
    2013-11-16
    Reader: A reader builds a data structure from one or more input streams. The input streams are usually text but can be binary data as well. Examples include configuration file readers, program analysis tools such as a method cross-reference tool, and class file loaders.• Generator: A generator walks an internal data structure and emits output. Examples include object-to-relational database mapping tools, object serializers, source code generators, and web page generators.• Translator or Rewriter: A translator reads text or binary input and emits output conforming to the same or a different language. It is essentially a combined reader and generator. Examples include translators from extinct programming languages to modern lan- guages, wiki to HTML translators, refactorers, profilers that...
  • Smile
    2019-12-06
    下面把这些类型计算表合并到模式二十的代码中。首先要修改操作符返回类型,以支持 Symboltable中的方法。然后要在Types.g中使用一些规则来处理变量初始化语句、返回语句和赋值语句。
  • Smile
    2019-12-06
    实现 Cymbal的返回值类型表时,需要先定义各个类型的序号。然后定义类型。有了这些定义,就能填写算术操作的返回类型表了。
  • Smile
    2019-12-06
    要实现算术类型提升,还需要两个函数:第一个函作数类型,能判断操作的结果类型;第二个函数根据输结果类型,能判断是否要进行类型提升。
  • Smile
    2019-12-06
    类型提升的目的就是统一操作类型。编译器的语义分析器使用静态类型分析器来判断该提升哪一个元素或子表达式。通常,分析器会修改中间表示树以加入需要类型转换的节点。翻译器只要进行标注即可,类型转换可以在代码生成阶段完成,这比修改树要容易多了不光是表达式,静态类型分析器还需要分析赋值语句、返回语句、函数调语句和数组下标语句中的值的类型,以检查是否需要提升。
  • Smile
    2019-12-05
    语句的含义既反映在其结构里(语法),又体现于它所使用的符号和词汇中。结构指明的是该进行什么操作,而符号代表的是对什么进行操作。这里会对许多类型安全规则进行检查。简言之,所有的操作和赋值语句中操作数的类型必须合法本章的几种模式都会采用三次遍历,实际上,它们前两次遍历都一样。第一次遍历, Symbol解析器构建AST:第二次遍历,树遍历器构建作用域树,并生成符号表。模式ニ十的第三次遍历会在遍历AST的时候计算各个表达式的类型。
  • Smile
    2019-12-05
    Python采取动态类型机制,因此程序员不用指明程序实体的类型(而编译器也无法通过推断计算出所有的类型)。 Python的解释器会在运行时检查所有的语义规则。C++正好处于另一个极端,虽然其他的规则都是执行时完成的,但C+是静态类型语言,使用者必须指定所有程序实体的类型。程序实体的概念比较广泛,包括程序中的常量、变量、函数、方法、类等要素。有些语言在编译时对某些语义规则进行静态检查,但为了防止恶意程序造成破坏,在执行时还会再次检査。比如,Java在编译时刻和运行时刻都会做类型检查。
  • Smile
    2019-12-13
    的输出语言)的语法都会搅和在一起。使用这种显式的生成类时,输入模型和输出模型之间的连通管道通常都是构造方法的参数。将赋值子树映射到对应的输出对象其实是很自然的过程,下面来考虑更复杂的情况:译标矩的垂法运算两者的语法都一样,但是语义上却有很大的差别。所以,要想创建正确的输出模型,翻译时必须检测待翻译表达式的类型
  • Smile
    2019-12-13
    11.3模型驱动的翻译Model-driven Translation在模型驱动翻译器中,一切都要围绕解析器构建的输入模型进行。最简的就是创建AST模型,然后一边对其进行遍历,一边对其进行输出”。它与导译器唯一的区别是在历过程中生成代码,而不是在解析过程中生 AST的优点是可以在生成输出之前进行语义分析。
  • Smile
    2019-12-13
    图11.2中所示是使用这些引擎的方法,需要给引擎提供输入语言的文法和系列的转换规则。根据文法,引擎从输入内容构造解析樹,然后应用规则到输出。