Как разбить числа на 0, int и double при разборе в токенизаторе? - PullRequest
1 голос
/ 22 апреля 2019

Я пишу токенизатор (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
}
...