编译器相关知识点

javaCC工作原理

javaCC将输入的形如

TOKEN: {

    <IDENTIFIER: ["a"-"z", "A"-"Z", "_"] (["a"-"z", "A"-"Z", "_", "0"-"9"])*>

}

TOKEN: {

    <INTEGER: ["1"-"9"] (["0"-"9"])* ("U")? ("L")?//10进制

            | "0" ["x", "X"] (["0"-"9", "a"-"f", "A"-"F"])+ ("U")? ("L")?//16进制

            | "0" (["0"-"7"])* ("U")? ("L")?//8进制

            >

}

 这样的正则表达式转换为NFA,然后将NFA转换为DFA。

但是我们手写编译器的时候直接在草稿纸上画出NFA,然后手动将NFA转换为DFA。但是当所要实现的语言含有正则表达式的时候,代码中要有NFA,然后由代码自动转换为DFA。如javascript语言。

状态机中只要读进一个字符我们就能确定找到唯一一条边,或者时找到一个状态,所以我们称为确定有限自动状态机(DFA)

非确定有限状态机(NFA)。相比于确定有限自动状态机,非确定有限自动状态机中有一条或者多条边可以为空,或者有标有同一个符号的两条指向不同状态的边。例如下面两幅图:

                            

  因为,当读入一个数据的时候,我们无法确定到底选择哪一条边,所以,是非确定的。

  那么,将一个正则表达式转化成为一个确定有限状态机的过程为:正则表达式转化为非确定有限状态机,非确定有限状态机转化为确定有限状态机。

怎样将正则表达式转换为NFA?

正则表达式转化为非确定有限状态机,可以使用下图:

  

  这样将语言中的所有类分别使用正则表达式表示出来,然后将每个正则表达式表示成一个小的非确定有限制状态机,然后使用一个新的状态作为起始状态,用空边将该起始状态和其他小的非确定有限状态机的起始状态连接起来,就得到该语言的非确定有限状态机。

为了将非确定有限状态机转化为确定有限状态机,我们引入ε闭包的概念:将状态集合A(包含一个或者多个状态)和使用空边和A连接的状态组成的新的状态集合,得到的新的状态集合成为closure(A),那么就有如下等式:

                                             

  等式左边表示为:状态集合d吃掉一个标示符c后能够到达的状态的新状态集合(假设为)h。注意到因为有closure,所以h还包含使用空边和h中所有状态连接的状态。edge(s,c)标示从s出发,吃掉c后能到达的所有状态的集合。

  我们根据以上等式,将下面的左图(NFA)转化为右图(DFA):

 

  上图转化描述为:对于左图状态1,其ε闭包为A(1,4,9,14),就是右图中的开始状态集合。可以看出,这个集合A可以吃掉的字符包括i,a-z,0-9,以及任何字符(就是A中所有状态能够吃掉的字符的集合),如果A吃掉i(就是对A中的各个状态s求edge(s,i)),那么可以到达的集合为B`(2,5,15),再求closure(B `),则得到新的集合B(2,5,6,8,15)。然后考虑A吃掉(a-h,j-z),然后求闭包,那么得到集合C(5,6,8,15),等等。直到将A可以吃掉的字符都计算过后,我们就得到了上右图中,和起始状态集合连接的各个状态集合。然后依次再对其他状态集合进行相同操作。那么最终得到的式右图。这样就完成了NFA到DFA的转化。

  如果将右图中的每个状态集合看成一个状态,那么就得到了一个确定有限自动状态机。那么,对于右图每个状态(或者状态集合),我们如何确定这个状态(状态集合)代表的是语言中的哪个类呢?也就是如何确定右图中的每个状态的上角标,如ID,NUM,IF等。这里有三个原则需要遵守:

  第一:最长字符串原则。当我们遇到例如 if32i 这种字符串时,我们将对整个字符串进行匹配,而不是匹配到if就返回类型IF。

  第二:终止状态优先原则。在我们从NFA转化到DFA过程中,如果一个状态集合包含终止状态,则在转化后得到的DFA中,该状态集合为终止状态集合。

  第三:规则优先原则。如果转化后的状态集合包含多个终止状态,例如状态集合B中包含8和15,那么指定一个具有更高的规则优先级,在上面的例子中,我们指定8的规则优先级高,那么最终B代表的是ID类。那么在程序中如何指定呢?就是使用flex过程中,定义越靠前的正则表达式规则优先级越高。至于flex怎么使用,这不是我们的重点,可以参考其他资源。

  好了,以上就是所有的词法分析过程,其实,最终我们是将一个DFA转化为一个二维数组,如下:

                                                              

参考于:https://www.cnblogs.com/BlackWalnut/p/4467749.html ,这一系列的文章都很棒

猜你喜欢

转载自blog.csdn.net/raylrnd/article/details/82817630