Я пишу токенизатор (c ++) и хочу иметь единственную функцию для чтения целых чисел, двойных чисел (которые включают в себя «.», «+» И «e» в качестве идентификаторов) и возврата нескольких нулей как отдельных нулей.
Я написал код ниже, используя некоторую логику, которую я написал для идентификаторов и ключевых слов, но я думаю, что я что-то упустил или логика где-то не так.
Я также не уверен, есть ли способ сделать что-то вроде "ch.nextch () == что-то" (функция readch (), которая используется для чтения каждого символа).Я сделал много ООП в Java и смог ссылаться на такие вещи, как 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) ;
}
Ожидаемый вывод (что я неполучить, потому что он не распознает удваивает или разбивает кратные 0):
{вид: double, орфография: "4.3", строка: 1, столбец: 4}
{тип: double, орфография: "3.6e-89", строка: 1, столбец: 8}
{тип: double, орфография: "12125.34e + 9", строка: 1, столбец: 16}
{тип: double, орфография: "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
}