看了the c++ language programming 第六章 有问题了程序看懂 程序我已经打出来了 各位大虾 请赐教 谢谢 分不够再开
那个计算器 我怎么看也看不懂
它好象分了几个部分
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;
}
好象就这么多了