来自文件的C ++加载不断重复最后一个字符

时间:2014-05-13 22:52:57

标签: c++ do-while

所以我正在做一个编译器,我有一个LEXER的一部分,它检查一些字符是否形成一个INTEGER或一个真实的数字,这是由EBNF //REAL: DIGIT {DIGIT} . DIGIT {DIGIT} [ (e|E) [(+ | -)] <DIGIT> {DIGIT}

满足的

我有这部分代码(它的片段),它检查当它不是EOF或令牌不匹配时,它会继续对令牌进行分类

while (!isEOF() && !tokenMatch)
            {

                //Checking for INTEGERS and REAL
                //INTEGERS: DIGIT {DIGIT}
                if (isDigit(ch))
                {
                    strBuffer += ch;

                    do
                    {
                        ch = nextChar();
                        strBuffer += ch;
                    }
                    while (isDigit(ch));

                    //REAL or ERROR
                    //REAL: DIGIT {DIGIT} . DIGIT {DIGIT} [ (e|E) [(+ | -)] <DIGIT> {DIGIT}

                    if (ch == '.')
                    {
                        do
                        {
                            ch = nextChar();
                            strBuffer += ch;
                        }
                        while (isDigit(ch));

                        //EXPONENT
                        if (ch == 'E' || ch == 'e')
                        {
                            char peek = input -> peek();
                            //CHECK FOR + | -

                            if(peek == '+' || peek == '-')
                            {
                                ch = nextChar();
                                strBuffer += ch;

                                ch = nextChar();
                                if (isDigit(ch))
                                {
                                    do
                                    {
                                        strBuffer +=ch;
                                        ch = nextChar();
                                        cout << strBuffer << endl;
                                    }
                                    while (isDigit(ch));
                                }

问题在于我必须加载文本文件并从中获取字符。例如,如果我写了123.12 WITH 一个空格,则Lexer将停留在空白处。如果在EOF中没有空格,那么最后一个while循环会一直重复。


Next Char的实施 * input是一个声明为:

的异常
ifstream* input  = new ifstream("test.txt");

char nextChar()
        {
            *input >> noskipws >> ch;

            //check for new line. If true, increment Row and start column from 1
            if(ch == '\n')
            {
                row ++;
                col = 1;
            }
            else if (ch == '\t')
            {
                col +=4;
            }
            else
            {
                col++;

            }

            return ch;
        }

知道如何解决这个问题吗?

感谢

1 个答案:

答案 0 :(得分:1)

我会将nextChar更改为:

int nextChar()
{
   int ch = input->getc();

   if ( ch == EOF )
   {
      return ch;
   }
   //check for new line. If true, increment Row and start column from 1
   else if(ch == '\n')
   {
      row ++;
      col = 1;
   }
   else if (ch == '\t')
   {
      col +=4;
   }
   else
   {
      col++;
   }

   return ch;
}

并确保在调用getChar的任何地方使用int类型的变量,并在继续之前将返回的值与EOF进行比较。