看了the c++ language programming 第六章 有问题了程序看懂 程序我已经打出来了 各位大虾 请赐教 谢谢 分不够再开

sea373 2004-08-26 09:59:05
那个计算器  我怎么看也看不懂
它好象分了几个部分
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;
}

好象就这么多了 
...全文
125 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sea373 2004-08-26
  • 打赏
  • 举报
回复
自己先顶下
sea373 2004-08-26
  • 打赏
  • 举报
回复
怎么还没人回应呢???
sea373 2004-08-26
  • 打赏
  • 举报
回复
上面是我照书上面抄下来的 

能否哪个高手 把我的程序拷下来 在我不懂的后面注释下 行不 谢谢

先谢谢楼上的两没了
chqu18 2004-08-26
  • 打赏
  • 举报
回复
term(get);  //term()函数干什么?
应该是去掉前后空格
chqu18 2004-08-26
  • 打赏
  • 举报
回复

    enum Token_value{
NAME, NUMBER, END,
PLUS='+'; MINUS='-', MUL='*', DIV='/',
PRINT=';',ASSIGN='=', LP='{',RP='}'
};
这上面又是什么呢? 
这个是枚举类型的
一下子太多了,看不过来
sea373 2004-08-26
  • 打赏
  • 举报
回复
怎么还没人啊

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧