the c++ language programming 的第六章的例子看不懂 求教!!!!谢谢 能否在我抄的程序后面给出注释啊

时间:2022-08-07 01:15:46
它好象分了几个部分
1.parser
             program: 
                  end                   
                  expr_list end        // 这个干什么的?
       expr_list:
                  expression PRINT
                  expression PRINT expr_list 
       expression:
                  expression + term 
                  expression - term
                  term
             term :
                  term/primary
                  term*primary
                  primary
             primary: 
                  NUMBER 
                  NAME
                  NAME=expression
                  -primary
                  (expession)                  
         这上面是第一个部分 我的理解好象什么语法 反正比较模糊 概念比较模糊 希望朋友告诉我它是干啥的 为什么要这样定义
*****************************************************************************************
   
         enum Token_value{
                 NAME,     NUMBER,    END,
                 PLUS='+'; MINUS='-',  MUL='*',    DIV='/',
                 PRINT=';',ASSIGN='=', LP='{',RP='}'
                  };
           这上面又是什么呢? 
***************************************************************************************** 

           double expr(bool get)
             {  
                    double left=term(get);   //term()函数干什么?
                     for(;;)
                     switch( curr_tok){    //curr_tok 在别地方没看到这个参数?
                     case PLUS:
                               left+=term(true); //term(true)什么意思?
                                break;
                     case MINUS:
                               letf-=term(true);
                     default:
                          return left;
             }
       我知道 上面这个函数  是 对加法 减法的 选择的,我知道就这么多 :-)
**********************************************************    

     这里书上应该是一个跟上面差不多的 对乘法 除法的选择  我想上面 能懂了 这个也应该恩能看懂吧 
*****************************************************************************************


      double  number_value;
      string  string_value;
      double prim(bool get)        //  handle primaries   书上的解释 处理什么???
   {
       if(get) get_token();
              switch (curr_tok){
              case NUMBER:         //floating-point constant
              {
                  double v=number_value;
                  get_token()
                  return v;
               }
              case NAME :
               {
                   double& v=table[string_value];
                   if(get_token()==ASSIGN)  v=expr(true);
                    return v;
                }
              case MINUS :    // unary minus
                    return -prim(true);
              case LP:
               {
                   double e=expr(ture);
                   if(curr_tok!=RP) return error(" expected ");
                   get_token();     //eat ')'
                   return e;
                }
               default :
                   return error("primary expected);
                }
    }
                 
 这边又上一段 不怎么能理解 :-(
****************************************
下面 他的标题 是 the input function 
           Token_value get_token()
            {
                    char ch=0;
                    cin>>ch;
                    
                    switch(ch){
                    case  0:
                              return curr_tok=END;
                    case  ';':
                    case  '*':
                    case  '/':
                    case  '+';
                    case  '-':
                    case  '(':
                    case  ')':
                    case  '=':
                           return curr_tok=Token_value(ch);
  Nubern are handle like this :
                    case'0':case'1'..........
                    case'5':                 case'9':
                    case'.':
                     cin.putback(ch); 
                     cin>>number_value;
                     return curr_tok=NUMBER;
          default :                        //NAME,NAME=,OR ERROR   已经有的注册
                  if(isalpha(ch)){         //isalpha() 什么作用?
                   cin.putback(ch);
                    cin>>string_value;
                    return curr_tok=NAME;
                   }
                  error("bad token");
                  return vurr_tok=PRINT;
这上面的不怎么能理解
****************************************

here ,finally,is the complete input function
      Token_value get_token()
       {
                char ch=0;
                cin>>ch;
                switch (ch){
                case 0
                      return curr_tok=END;
                case ';':
                case '*':
                case '/':
                case '+':
                case '-':
                case '(':
                case ')':
                case '=':
                    return curr_tok=Token_value(ch);
                case'0':case '1':........
                case'5':case '6'........case '9':
                case'.':
                    cin.putback(ch);
                    cin>>number_value;
                    return curr_tok=NUMBER;
                defaut:
                    if(isalpha(ch)){
                         cin.putback(ch);
                         cin>>string_value;
                         return curr_tok=NAME;
                     }
                    error ("bad token");
                    return curr_tok=PRINT;
                 }
          }
上面的这段 还是不怎么能看懂 :(
**************************************************************************************
又是一节 
Low-level Input 

           Token_value  get_token()
             {
                char ch;
                do{    // skip whitespace except'n'   ??????
                     if(!cin.get(ch) return curr_tok=END; 
                   }while (ch!='\n'&&isspace(ch));
                switch(ch){
                case ';':
                case '\n':
                      return curr_tok=PRINT;

        default:
                     if(isalpha(ch)){
                            string_value=ch;
                            while(cin.get(ch)&&isalnum(ch)) string_value.push_back(ch);
                            cin.putback(ch);
                            return curr_tok=NAME;
                      }
                      error ("bad token");
                      return curr_tok=PRINT;
 上面的不懂
****************************
error handling 

             int no_of_errors;
             double error(const string& s)
             {
                 no_of_errors++;
                 cerr<<"error:"<<s<<'\n';
                 return 1;
             }
*******************************************************************************
它的标题 
the driver

            int main()
            {
                 table["pi"]=3.1415926535897932385;
                 table["e"]=2.7281828459042354;
                 while(cin)
                     get_token();
                     if(curr_tok==END)  break;
                     if(curr_tok==PRINT)  continue;
                     cout<<expr(false)<<'\n';
                     return no_of_errors;
             }

好象就这么多了 

20 个解决方案

#1


你该看看编译原理的书。其实就算懂了这些也没有什么意思。

#2


晕,这么长

#3


最上面是语法的定义,你可以找本编译的书了解一下,下面基本上还是便宜中的语法分析的递归下降法。

#4


这个程序是不怎么好理解,

多思考可以理解的。

BS书有点难度。

#5


有谁能给出注释 小的跪求!!!

#6


先谢谢楼上的几位

#7


和词法分析及语法分析有关

1.定义了计算器相关的语法形式,这样定义是为了后面的分析程序的基础。


#8


它好象分了几个部分
1.parser
program:
end
expr_list end // 这个干什么的?//如遇到END,结束
       expr_list:
expression PRINT           //如遇到‘;’,一段程序结束,
expression PRINT expr_list
       expression:
expression + term
expression - term
term
term :
term/primary
term*primary
primary
primary: 
NUMBER
NAME
NAME=expression
-primary
(expession)
这上面是第一个部分 我的理解好象什么语法 反正比较模糊 概念比较模糊 希望朋友告诉我它是干啥的 为什么要这样定义
*****************************************************************************************

    enum Token_value{
NAME, NUMBER, END,
PLUS='+'; MINUS='-', MUL='*', DIV='/',
PRINT=';',ASSIGN='=', LP='{',RP='}'
};
这上面又是什么呢? //就是符号表,也可以用映射做一个符号表,每次使用时载入
***************************************************************************************** 
//expr,term,prim,分层表示了,运算符的先后问题,你可以先把他们放在一
//个程序里,可以简单点
//以,运算符的先后大小: prim,term,expr
double expr(bool get)
{
double left=term(get);  //term()函数干什么?
for(;;)
switch( curr_tok){    //curr_tok 在别地方没看到这个参数?
case PLUS:
left+=term(true); //term(true)什么意思?
break;
case MINUS:
letf-=term(true);
default:
return left;
}
我知道 上面这个函数  是 对加法 减法的 选择的,我知道就这么多 :-)
**********************************************************

这里书上应该是一个跟上面差不多的 对乘法 除法的选择  我想上面 能懂了 这个也应该恩能看懂吧 
*****************************************************************************************


double number_value;
string string_value;
double prim(bool get) // handle primaries 书上的解释 处理什么???
   {
       if(get) get_token();
switch (curr_tok){
case NUMBER: //floating-point constant
{
double v=number_value;
get_token()
return v;
}
case NAME :
{
double& v=table[string_value];
if(get_token()==ASSIGN) v=expr(true);
return v;
}
case MINUS : // unary minus
return -prim(true);
case LP:
{
double e=expr(ture);
if(curr_tok!=RP) return error(" expected ");
get_token(); //eat ')'
return e;
}
default :
return error("primary expected);
}
}

这边又上一段 不怎么能理解 :-(
****************************************
下面 他的标题 是 the input function
Token_value get_token()
{
char ch=0;
cin>>ch;

switch(ch){
case 0:
return curr_tok=END;
case ';':
case '*':
case '/':
case '+';
case '-':
case '(':
case ')':
case '=':
return curr_tok=Token_value(ch);
Nubern are handle like this :
case'0':case'1'..........
case'5': case'9':
case'.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
default : //NAME,NAME=,OR ERROR   已经有的注册
if(isalpha(ch)){ //isalpha() 什么作用?//流的输入,
 cin.putback(ch); // 如是char,我把已经读的一个字符放回流,再读整个字段
cin>>string_value;
return curr_tok=NAME;
}
error("bad token");
return vurr_tok=PRINT;
这上面的不怎么能理解
****************************************

here ,finally,is the complete input function
Token_value get_token()
{
char ch=0;
cin>>ch;
switch (ch){
case 0
return curr_tok=END;
case ';':
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=Token_value(ch);
case'0':case '1':........
case'5':case '6'........case '9':
case'.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
defaut:
if(isalpha(ch)){
cin.putback(ch);
cin>>string_value;
return curr_tok=NAME;
}
error ("bad token");
return curr_tok=PRINT;
}
}
//上面的这段 还是不怎么能看懂 :(
//这里是流的问题,如不了解流,有点难度,
**************************************************************************************
又是一节 
Low-level Input

Token_value get_token()
{
char ch;
do{    // skip whitespace except'n'   ??????
if(!cin.get(ch) return curr_tok=END; 
}while (ch!='\n'&&isspace(ch));
switch(ch){
case ';':
case '\n':
return curr_tok=PRINT;

        default:
if(isalpha(ch)){
string_value=ch;
while(cin.get(ch)&&isalnum(ch)) /
string_value.push_back(ch);
cin.putback(ch);
return curr_tok=NAME;
}
error ("bad token");
return curr_tok=PRINT;
上面的不懂
//上面的这段 还是不怎么能看懂 :(
//这里是流的问题,如不了解流,有点难度,
//简单的解决了空格问题
****************************
error handling

int no_of_errors;
double error(const string& s)
{
no_of_errors++;
cerr<<"error:"<<s<<'\n';
return 1;
}
*******************************************************************************
它的标题 
the driver

int main()
{
table["pi"]=3.1415926535897932385;
table["e"]=2.7281828459042354;
while(cin)
get_token();
if(curr_tok==END) break;
if(curr_tok==PRINT) continue;
cout<<expr(false)<<'\n';
return no_of_errors;
}

好象就这么多了

#9


楼上的强了 看来 我得加油 再加油了  先谢谢了

#10


我听说 the c++ language programming 是学c++比较简单的书了 我看了怎么还有那么多的问题 我该怎么看呢 望大家指点!!谢谢

#11


TCPL
是学习C++最权威的书,但不是简单的。
而且,这本书不论风格还是例子(包括一些用词)都十分的学术化,不太适合经验不足的人看,而且需要一些计算机的理论知识

#12


谢谢楼上的哦

#13


看语法建议用C++PRIMER

#14


the c++ language programming

确实好,但是有些话(文字),还是没有翻译好.

#15


楼上的兄弟 我看的英文版的 也有本中文版的  可能是语法太难 我的基础也太差了 

不过我会加油的

#16


看楼主应该是刚开始学C++,BS的这本书你现在确实太困难了,因为这本书不是以语法为第一目的,而是再将深入理解C++的一些语法及实现细节。建议先看看入门一级的书籍,比如,C++Primer,BS的书中有很多关于系统的东西,不好理解,我也正在读,有的时候很费劲啊,特别是异常处理那块,看得我直郁闷,不过好歹是给看过去了。楼主加油吧,C++的世界很精彩啊

#17


楼上正解

#18


to   cytbox(没人爱又怎样?)

 哎 开始 我听说  c++ primer 这个难的啊  说bs 这个简单的 哎 
真的不知道

看来 我的看c++primer 了

谢谢楼上的 谢谢

#19


我看c++ primer 的时候 人家叫我看 bs  哎  我 我 真他吗的怀疑我自己的能力了

#20


bs的东西学术味道比较强,说实在的lippman的也别指望轻松搞定,谁叫咱们要使c++。):
不过只要你坚持看下去一定会有好结果的。:)祝好运!

#1


你该看看编译原理的书。其实就算懂了这些也没有什么意思。

#2


晕,这么长

#3


最上面是语法的定义,你可以找本编译的书了解一下,下面基本上还是便宜中的语法分析的递归下降法。

#4


这个程序是不怎么好理解,

多思考可以理解的。

BS书有点难度。

#5


有谁能给出注释 小的跪求!!!

#6


先谢谢楼上的几位

#7


和词法分析及语法分析有关

1.定义了计算器相关的语法形式,这样定义是为了后面的分析程序的基础。


#8


它好象分了几个部分
1.parser
program:
end
expr_list end // 这个干什么的?//如遇到END,结束
       expr_list:
expression PRINT           //如遇到‘;’,一段程序结束,
expression PRINT expr_list
       expression:
expression + term
expression - term
term
term :
term/primary
term*primary
primary
primary: 
NUMBER
NAME
NAME=expression
-primary
(expession)
这上面是第一个部分 我的理解好象什么语法 反正比较模糊 概念比较模糊 希望朋友告诉我它是干啥的 为什么要这样定义
*****************************************************************************************

    enum Token_value{
NAME, NUMBER, END,
PLUS='+'; MINUS='-', MUL='*', DIV='/',
PRINT=';',ASSIGN='=', LP='{',RP='}'
};
这上面又是什么呢? //就是符号表,也可以用映射做一个符号表,每次使用时载入
***************************************************************************************** 
//expr,term,prim,分层表示了,运算符的先后问题,你可以先把他们放在一
//个程序里,可以简单点
//以,运算符的先后大小: prim,term,expr
double expr(bool get)
{
double left=term(get);  //term()函数干什么?
for(;;)
switch( curr_tok){    //curr_tok 在别地方没看到这个参数?
case PLUS:
left+=term(true); //term(true)什么意思?
break;
case MINUS:
letf-=term(true);
default:
return left;
}
我知道 上面这个函数  是 对加法 减法的 选择的,我知道就这么多 :-)
**********************************************************

这里书上应该是一个跟上面差不多的 对乘法 除法的选择  我想上面 能懂了 这个也应该恩能看懂吧 
*****************************************************************************************


double number_value;
string string_value;
double prim(bool get) // handle primaries 书上的解释 处理什么???
   {
       if(get) get_token();
switch (curr_tok){
case NUMBER: //floating-point constant
{
double v=number_value;
get_token()
return v;
}
case NAME :
{
double& v=table[string_value];
if(get_token()==ASSIGN) v=expr(true);
return v;
}
case MINUS : // unary minus
return -prim(true);
case LP:
{
double e=expr(ture);
if(curr_tok!=RP) return error(" expected ");
get_token(); //eat ')'
return e;
}
default :
return error("primary expected);
}
}

这边又上一段 不怎么能理解 :-(
****************************************
下面 他的标题 是 the input function
Token_value get_token()
{
char ch=0;
cin>>ch;

switch(ch){
case 0:
return curr_tok=END;
case ';':
case '*':
case '/':
case '+';
case '-':
case '(':
case ')':
case '=':
return curr_tok=Token_value(ch);
Nubern are handle like this :
case'0':case'1'..........
case'5': case'9':
case'.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
default : //NAME,NAME=,OR ERROR   已经有的注册
if(isalpha(ch)){ //isalpha() 什么作用?//流的输入,
 cin.putback(ch); // 如是char,我把已经读的一个字符放回流,再读整个字段
cin>>string_value;
return curr_tok=NAME;
}
error("bad token");
return vurr_tok=PRINT;
这上面的不怎么能理解
****************************************

here ,finally,is the complete input function
Token_value get_token()
{
char ch=0;
cin>>ch;
switch (ch){
case 0
return curr_tok=END;
case ';':
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=Token_value(ch);
case'0':case '1':........
case'5':case '6'........case '9':
case'.':
cin.putback(ch);
cin>>number_value;
return curr_tok=NUMBER;
defaut:
if(isalpha(ch)){
cin.putback(ch);
cin>>string_value;
return curr_tok=NAME;
}
error ("bad token");
return curr_tok=PRINT;
}
}
//上面的这段 还是不怎么能看懂 :(
//这里是流的问题,如不了解流,有点难度,
**************************************************************************************
又是一节 
Low-level Input

Token_value get_token()
{
char ch;
do{    // skip whitespace except'n'   ??????
if(!cin.get(ch) return curr_tok=END; 
}while (ch!='\n'&&isspace(ch));
switch(ch){
case ';':
case '\n':
return curr_tok=PRINT;

        default:
if(isalpha(ch)){
string_value=ch;
while(cin.get(ch)&&isalnum(ch)) /
string_value.push_back(ch);
cin.putback(ch);
return curr_tok=NAME;
}
error ("bad token");
return curr_tok=PRINT;
上面的不懂
//上面的这段 还是不怎么能看懂 :(
//这里是流的问题,如不了解流,有点难度,
//简单的解决了空格问题
****************************
error handling

int no_of_errors;
double error(const string& s)
{
no_of_errors++;
cerr<<"error:"<<s<<'\n';
return 1;
}
*******************************************************************************
它的标题 
the driver

int main()
{
table["pi"]=3.1415926535897932385;
table["e"]=2.7281828459042354;
while(cin)
get_token();
if(curr_tok==END) break;
if(curr_tok==PRINT) continue;
cout<<expr(false)<<'\n';
return no_of_errors;
}

好象就这么多了

#9


楼上的强了 看来 我得加油 再加油了  先谢谢了

#10


我听说 the c++ language programming 是学c++比较简单的书了 我看了怎么还有那么多的问题 我该怎么看呢 望大家指点!!谢谢

#11


TCPL
是学习C++最权威的书,但不是简单的。
而且,这本书不论风格还是例子(包括一些用词)都十分的学术化,不太适合经验不足的人看,而且需要一些计算机的理论知识

#12


谢谢楼上的哦

#13


看语法建议用C++PRIMER

#14


the c++ language programming

确实好,但是有些话(文字),还是没有翻译好.

#15


楼上的兄弟 我看的英文版的 也有本中文版的  可能是语法太难 我的基础也太差了 

不过我会加油的

#16


看楼主应该是刚开始学C++,BS的这本书你现在确实太困难了,因为这本书不是以语法为第一目的,而是再将深入理解C++的一些语法及实现细节。建议先看看入门一级的书籍,比如,C++Primer,BS的书中有很多关于系统的东西,不好理解,我也正在读,有的时候很费劲啊,特别是异常处理那块,看得我直郁闷,不过好歹是给看过去了。楼主加油吧,C++的世界很精彩啊

#17


楼上正解

#18


to   cytbox(没人爱又怎样?)

 哎 开始 我听说  c++ primer 这个难的啊  说bs 这个简单的 哎 
真的不知道

看来 我的看c++primer 了

谢谢楼上的 谢谢

#19


我看c++ primer 的时候 人家叫我看 bs  哎  我 我 真他吗的怀疑我自己的能力了

#20


bs的东西学术味道比较强,说实在的lippman的也别指望轻松搞定,谁叫咱们要使c++。):
不过只要你坚持看下去一定会有好结果的。:)祝好运!

#21