所以我正在做一个编译器,我有一个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;
}
知道如何解决这个问题吗?
感谢
答案 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
进行比较。