gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:52:38 24 4
gpt4 key购买 nike

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


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

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 处没有空格,最后一个 do while 循环会一直重复下去。


下一个字符的实现*input 是一个 instream 声明为:

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;
}

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

谢谢

最佳答案

我会将 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 进行比较。

关于C++从文件加载不断重复最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23642928/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com