首页 > 代码库 > 文法也可以通俗易懂
文法也可以通俗易懂
一直都说编织知识网,利用已有的节点去建立新的节点,但是一直做的不好,今天看到对文法解释的这个例子,真真切切的体会到了编织知识网给我们带来的巨大好处。
文法给你的印象什么样的?抽象?晦涩?不知所云?神马终结符、字母表、产生式、闭包、自动机……晕死
但是看完下面的例子,你会感叹:原来这就是文法!
文法就是用来描述语言的语法结构的形式规则,所以先有这样一个认识,文法就是语法。
例子(摘自:软件设计师考试):
张三和李四是工程师。
由5个词组成:张三 和 李四 是 工程师
组成一个句子:由主语、谓语构成。我们知道中文的文法:
<句子> --> <主语> <谓语>
<主语> -- > <名词词组>
<名词词组> --> <名词> <连词> <名词词组>
<谓语> --> < 动宾词组>
<动宾词组> --> <动词> <宾语>
<宾语> --> <名词>
<名词> --> 张三丨李四丨工程师
<连词> --> 和
<动词> --> 是
在上面的例子中,所有用<>包括起来的都是“非终结符”,而所有直接写出来的就是“终结符”,以上规则就是“产生式”。
基于上述说法,现在看下面的概念
非终结符:它不是语言的组成部分,而是在推导过程中的占位符,最终要替换成终结符。
终结符:语言是组成部分,是最后的内容。
产生式:用终结符替代非终结符的规则。
起始符:能够用于语言开头的符号,在本例中的<主语>就是起始符。
原本晦涩难懂的概念,是不是一下清晰了很多。
根据上面的产生式,下面我们来看句子是如何被推导出来的:
<句子> => <主语><谓语>
=> <名词词组><谓语>
=> <名词><连词><名词词组><谓语>
=> <名词><连词><名词词组><动宾词组>
=> <名词><连词><名词词组><动词><名词>
=> 张三和李四是工程师
我们从中可以发现,它也可以推导出“张三和工程师是李四”,这句话是符合语法的,但是语义有问题,所以语法的分析只能发现语法上的错误。
那么联想一下,词法分析呢?还记得我们经常分析的问题吗?
(0|1)*01这是一个由0、1组成的字符串,并且以01结尾。所以不难想到,程序编译时怎么判断变量的命名是否准确呢?构造一个以字母、下划线开头,由字母、下划线、数字组成的有限自动机即可。
文法也可以通俗易懂