TC++PL第六章计算器例子所接受的语言的语法````看不
这个计算器包含四个主要部分:一个分析器,一个输入函数,一个符号表,和一个驱动程序。 实际上,他就是一个缩微的编译器:分析器做语法分析,输入函数处理输入和词法分析,符号表保存持久信息,驱动程序处理,初始化,输出,错误操作。我们还可以给这这计算器加更多的功能,使它变得更实用。但是这些代码已经足够可以展示C++的使用内部机理,再多的功能只是增加代码的长度。 这里是该计算器所接受的语言的语法:
下面该计算器所接受的语言的语法:
program:
END / / END is endofinput
expr_ list END
expr_ list:
expression PRINT / / PRINT is semicolon
expression PRINT expr_ list
expression:
expression + term
expression- term
term
term:
term / primary
term * primary
primary
primary:
NUMBER
NAME
NAME = expression
-primary
( expression )
//@@@@@@@@@@@@@就是上面这些`我看不懂`不知道应该怎么去理解@@@@@@@@@@@@
换句话说,一个程序就是由逗号分开的表达式序列。最基本的表达式是 数字,名称 ,操作符 *,/,+,-( 一元和二元),和=。 名称在使用前不需要声明。
............................
[解决办法]
这是一个上下文无关文法(对应下推自动机)的产生式。
它包含五个变量(非终结符):program,expr_ list,expression,term,primary;
十一个符号(终结符):END,PRINT,+,-,/,*,NUMBER,NAME,=,(,);
程序读取由符号组成的字符串时,分析器就可以根据这些产生式生成语法树,判断出输入的字符串是否可被接受(有没有语法错误?)以及如何解释它(语义是什么?)
下面举几个例子来帮助理解。
产生式举例一
program:
END
expr_ list END
program 是第一个变量,因此它表示整个语言。即该语言的所有实例都是一个program 。而program 可以是 END ,也可以是一个 expr_ list 后面紧跟一个 END 。
产生式举例二
expression:
expression + term
expression - term
term
expression 可以是 expression + term 或 expression- term 或 term 。注意前两个子句是左递归的,所以这个产生式形成了任意多个 term 做 +/- 运算的表达式
产生式举例三
primary:
NUMBER
NAME
NAME = expression
-primary
( expression )
通过前两个例子,可以很容易的理解这个例子。一个 primary 可以是五种情况中的任意一种。注意 NUMBER,NAME,=,单目的-,(,) 通过 primary 而最终成为program的一部分(其他组成语言的符号也一样,通过各自所在的产生式而最终包含在了语言的实例中)。
由于C++是一种上下文无关语言,所以可以使用上下文无关文法来定义C++。在C++标准中也确实是用这种方式来定义C++的。