首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

TC++PL第六章计算器例子所接受的语言的语法`看不解决办法

2012-02-06 
TC++PL第六章计算器例子所接受的语言的语法````看不这个计算器包含四个主要部分:一个分析器,一个输入函数,

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++的。

热点排行