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书有点难度。
多思考可以理解的。
BS书有点难度。
#5
有谁能给出注释 小的跪求!!!
#6
先谢谢楼上的几位
#7
和词法分析及语法分析有关
1.定义了计算器相关的语法形式,这样定义是为了后面的分析程序的基础。
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;
}
好象就这么多了
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++最权威的书,但不是简单的。
而且,这本书不论风格还是例子(包括一些用词)都十分的学术化,不太适合经验不足的人看,而且需要一些计算机的理论知识
是学习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 了
谢谢楼上的 谢谢
哎 开始 我听说 c++ primer 这个难的啊 说bs 这个简单的 哎
真的不知道
看来 我的看c++primer 了
谢谢楼上的 谢谢
#19
我看c++ primer 的时候 人家叫我看 bs 哎 我 我 真他吗的怀疑我自己的能力了
#20
bs的东西学术味道比较强,说实在的lippman的也别指望轻松搞定,谁叫咱们要使c++。):
不过只要你坚持看下去一定会有好结果的。:)祝好运!
不过只要你坚持看下去一定会有好结果的。:)祝好运!
#21
#1
你该看看编译原理的书。其实就算懂了这些也没有什么意思。
#2
晕,这么长
#3
最上面是语法的定义,你可以找本编译的书了解一下,下面基本上还是便宜中的语法分析的递归下降法。
#4
这个程序是不怎么好理解,
多思考可以理解的。
BS书有点难度。
多思考可以理解的。
BS书有点难度。
#5
有谁能给出注释 小的跪求!!!
#6
先谢谢楼上的几位
#7
和词法分析及语法分析有关
1.定义了计算器相关的语法形式,这样定义是为了后面的分析程序的基础。
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;
}
好象就这么多了
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++最权威的书,但不是简单的。
而且,这本书不论风格还是例子(包括一些用词)都十分的学术化,不太适合经验不足的人看,而且需要一些计算机的理论知识
是学习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 了
谢谢楼上的 谢谢
哎 开始 我听说 c++ primer 这个难的啊 说bs 这个简单的 哎
真的不知道
看来 我的看c++primer 了
谢谢楼上的 谢谢
#19
我看c++ primer 的时候 人家叫我看 bs 哎 我 我 真他吗的怀疑我自己的能力了
#20
bs的东西学术味道比较强,说实在的lippman的也别指望轻松搞定,谁叫咱们要使c++。):
不过只要你坚持看下去一定会有好结果的。:)祝好运!
不过只要你坚持看下去一定会有好结果的。:)祝好运!