我正在编写一个令牌生成器(c ++),并希望有一个函数来读取整数,双精度数(包括'。','+'和'e'作为标识符)并返回多个0作为单个0。< / p>
我已经使用一些为标识符和关键字编写的逻辑编写了下面的代码,但是我认为我遗漏了一些东西,或者该逻辑在某处是错误的。
我也不确定是否有办法做类似的事情 “ ch.nextch()==某物”(函数nextch()是读取每个字符的方式)。我在Java中做了很多OOP,并且能够引用诸如student.next()之类的东西,但是我对c ++的经验不足。
static Token parse_number()
{
string spelling = "" ;
// append digits to spelling until we read past the end of the integer
do
{
spelling += ch ;
nextch() ;
} while ( isdigit(ch)) ;
if( ch == '0' && ch.next() != '.')
{
return new_token(tk_integer, "0" + '\n', line_num, column_num) ;
nextch() ;
}
if( ch == '0' && ch.nextch() == '.' || ch.nextch() == 'e' || ch.nextch() =='E' || ch.nextch() == '+')
{
spelling += ch;
return new_token(tk_double, spelling, line_num, start_column) ;
}
// return a new Token object
return new_token(tk_integer,spelling, line_num, start_column) ;
}
预期的输出(我没有得到,因为它无法识别双精度数或零的倍数):
{种类:双精度,拼写:“ 4.3”,第1行,第1列:4}
{种类:双,拼写:“ 3.6e-89”,行:1,列:8}
{种类:双,拼写:“ 12125.34e + 9”,第1行,第16列}
{种类:双精度,拼写:“ 888e + 0”,第1行,第27列}
{种类:整数,拼写:“ 34”,行:1,列:33}
{种类:整数,拼写:“ 0”,行:1,列:36}
{种类:双精度,拼写:“ 0.000000e-00008”,第1行,第38列}
其他不可编辑但被称为函数:
typedef int Token ;
enum TokenKind ;
tk_number, // one of tk_integer or tk_double
tk_integer, // any integer
tk_double, // any floating point number
主要功能:
int main(int argc,char **argv)
{
Token token ;
int count = 0 ;
// remember and display each token as it is read
token = next_token() ;
while ( token_kind(token) != tk_eoi )
{
cout << token_to_string(token) << endl ;
token = next_token() ;
count++ ;
}
cout << "read " << count << " tokens" << endl ;
return 0 ;
}
下一个读取功能:
static void nextch()
{
extern int read_char() ;
if ( ch == EOF ) return ;
if ( ch == '\n' ) // if last ch was newline ...
{
line_num++ ; // increment line number
column_num = 0 ; // reset column number
}
if ( ch == '\t')
{
count++ ;
column_num = 8 * count ;
}
ch = getchar() ; // read the next character from stdin
column_num++ ; // increment the column number
}