首页 > 代码库 > 文法也可以通俗易懂

文法也可以通俗易懂

    一直都说编织知识网,利用已有的节点去建立新的节点,但是一直做的不好,今天看到对文法解释的这个例子,真真切切的体会到了编织知识网给我们带来的巨大好处。
    文法给你的印象什么样的?抽象?晦涩?不知所云?神马终结符、字母表、产生式、闭包、自动机……晕死
    但是看完下面的例子,你会感叹:原来这就是文法!


    文法就是用来描述语言的语法结构的形式规则,所以先有这样一个认识,文法就是语法
例子(摘自:软件设计师考试):
    张三和李四是工程师。
    由5个词组成:张三 和 李四 是 工程师
    组成一个句子:由主语、谓语构成。我们知道中文的文法:
    <句子> --> <主语> <谓语>
    <主语> -- > <名词词组>
    <名词词组> --> <名词> <连词> <名词词组>
    <谓语> --> < 动宾词组>
    <动宾词组> --> <动词> <宾语>
    <宾语> --> <名词>
    <名词> -->  张三丨李四丨工程师
    <连词> --> 和
    <动词> --> 是
    在上面的例子中,所有用<>包括起来的都是“非终结符”,而所有直接写出来的就是“终结符”,以上规则就是“产生式”。


    基于上述说法,现在看下面的概念
    非终结符:它不是语言的组成部分,而是在推导过程中的占位符,最终要替换成终结符。
    终结符:语言是组成部分,是最后的内容。
    产生式:用终结符替代非终结符的规则。
    起始符:能够用于语言开头的符号,在本例中的<主语>就是起始符。


    原本晦涩难懂的概念,是不是一下清晰了很多。


    根据上面的产生式,下面我们来看句子是如何被推导出来的:
    <句子> => <主语><谓语>
           => <名词词组><谓语>
           => <名词><连词><名词词组><谓语>
           => <名词><连词><名词词组><动宾词组>
           => <名词><连词><名词词组><动词><名词>
           => 张三和李四是工程师

    我们从中可以发现,它也可以推导出“张三和工程师是李四”,这句话是符合语法的,但是语义有问题,所以语法的分析只能发现语法上的错误。


    那么联想一下,词法分析呢?还记得我们经常分析的问题吗?
    (0|1)*01这是一个由0、1组成的字符串,并且以01结尾。所以不难想到,程序编译时怎么判断变量的命名是否准确呢?构造一个以字母、下划线开头,由字母、下划线、数字组成的有限自动机即可。

文法也可以通俗易懂