在令牌分析器中进行解析时,如何将数字拆分为0,int和double?

时间:2019-04-22 05:12:54

标签: c++ numbers int double tokenize

我正在编写一个令牌生成器(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
}

0 个答案:

没有答案