`
NeuronR
  • 浏览: 59782 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
文章列表
    在使用了大量的宏来快速构建函数后,一个问题出现了:如果你发现某个地方出了bug,你得定位它,于是使用debugger,然而宏的“简易”导致你进行了许多次“下一步”还是停留在使用宏的那一行。     当然也不是完全没 ...
    在构造之前当然要先抽取接口,让其它语法分析器能愉快的跟LR分析器相处 /* syntax-analyser.h */ void initialLRStates(void); void destructLRStates(void); 第一个函数是构造函数,第二个则是析构函数。这些东西跟LR分析器的构造函数是独立,因为分析预测表(也就是LR状态集)是一个静态数据结构,比如我曾经说在状态Sentence_LBraceBasicBlockRBrace_1中,可以委托一个新的LR分析器对内部的基本块进行分析,而不用当前LR分析器再去纠结于大括号嵌套,而无论当前有多少个LR分析器在分析器栈中,它们 ...
    由于识别表达式的工作已经委托给其他的分析器去做了,因此这一阶段需要关注的产生式其实很少,它们是:   Jerry -> BasicBlock <END>   BasicBlock -> ε BasicBlock -> Sentence BasicBlock   Sentence -> <EOS> Sentence -> IfElseBranch Sentence -> WhileLoop Sentence -> Declaration
    好了,现在来尝试把那些该未实现的注释给实现掉了。当然有两个地方在上一节中本应该实现,它们是代码块1中的 // 将一个左括号压入栈顶 // 实现为 opana->opStack->push(opana->opStack, newOperator(LPARENT, 0x7fffffff, nullOperate));  和代码块3中的 self->opStack->push(self->opStack, newOperator(token->t ...
    算符优先分析用来处理表达式非常便捷,甚至你可以忘记算术运算相关的一切产生式。对于算符优先分析来说最重要的东西有三:运算符的优先级、元和结合方式。优先级在任务布置时已经讲过了;元很简单,一般运算符都是二元的,只有正号和负号是一元的;结合方式一般分两种,普通的运算都是左结合的,赋值和乘幂运算是右结合的,而Jerry不支持乘幂运算。简单的表达式求值算法可以参考这篇文章,文中相关实现也是基于该算法的。       算符分析器需要两个栈,一个用来存放符号,一个用来存放操作数,因此该结构可以这样实现 /* datastruct.h */ struct OperationAnalyser { ...
    之前小小地透露过,我会用LR分析方法。它很强大,而且效率比较高,而且Jerry语言的语法(虽然还未具体证实,但我可以保证)是相对(于LALR(1)或LR(1)方法)容易构造的SLR(1)文法。     然而无论如何,Jerry语言语法的复杂 ...
    现在完成的是一个词法分析器,那么怎么将它与语法分析相连?     话说,基本上所有的编译器构造相关的文章都是把词法分析丢在语法分析之前,类似这样:   预处理(C语言为代表,Jerry没这一环) -> 词法分析 ->  ...
    错误处理的方法之一是认可错误的输入,将它判定为某一种正确输入的变体,然后在报出错误后再其纠正它。这个过程很大程度上跟经验相关,对于出错的经验越丰富,那么就可以矫正越多种类的错误。在词法分析中这一点体现得并不多——词法本身很简单,而敲击键错误导致的某些错误程序员应该会及时看到(比如在Jerry编程时非注释的部分输入了一个"@"符号)并改正它。而语法分析过程中这种情况则少得多,比如输入     a = 2 + 3     if (a == 0) 这样一小段,上一句赋值后没有分号,而导致后面的分支语句这是会被认为仍是上一句的一部分,但是这显然是不合理的。按照刚才说的矫正方法 ...
到了终结之前那一团散沙的时候了。先把几个头文件列出来。下面每一段代码的首行注释的内容表示包含这些代码的文件的文件名。 /* const.h */ #ifndef _CONSTANT_H #define _CONSTANT_H typedef enum { END, IDENT, ELSE, IF, WHILE, READ, WRITE, BREAK, INTEGER_TYPE, REAL_TYPE, INTEGER, REAL, PLUS, MINUS, MULTIPLY, DIVIDE, ASSIGN, LT, LE, EQ, NE, GT, GE, AND ...
    词法分析的最终目标是将输入字符流变成一个个符号,因此还需要引入一个新的结构: /* datastruct.h */ struct Token { int line; // 所在行 AcceptType type; // 类型 char* image; // 像 }; 其中type和image域是至关重要的,分别表示该符号的接受类型和"外貌",后者对于常数值、标识符很重要,而对于关键字和运算符,实际上知道其类型就行了。而所在行line域则是调试和报错时需要用到。    为了不使解析过程过于复杂,并且考虑到设计应该尽可能的模块化,实现中将产生符 ...
NFA这种东西似乎并不是特别重要,它应该是数学家关心的东西——对于一个词法并不复杂到变态的语言,直接画出其DFA也不是什么困难的事情。而作为无视正则表达式的代价,DFA的初始化显得非常重要。 上一篇文章《再见,正则 ...
对于用过Yacc、Javacc的人来说这个标题可能是不可思议的,难道不是先从词法分析入手?其实我只是试图换个角度,用有穷自动机而不是正则式来实现词法分析。两者虽然在数学上是等价的,但是实现有很大不同。如果你跟我一样 ...
概述     Jerry 语言总体上来说是 C 语言的子集,满足 Jerry 语言的词法、语法、语义均满足 C 语 言,除了 IO 语句。     它没有 main 函数,而是从代码第一行开始,直到结束。它也不支持函数调用。     IO 语句并不是调用函数,使用这样的语句来进行 IO:            read x;            write x + 1; 其中 read 和 write 都是 Jerry 语言的关键字。     支持 if-else(else 可选)条件分支,while 循环语句,以及 break 跳出循环。     支持四则运算,正负号 ...
Global site tag (gtag.js) - Google Analytics