【问题标题】:Chars are not read properly [closed]字符读取不正确[关闭]
【发布时间】:2021-12-21 04:01:02
【问题描述】:

所以我想与词法分析器一起工作以改进我对字符和字符串的工作,但事实证明我完全无法理解它们。我做了两个非常简单的函数来识别特定的字符并返回真或假。

//Not the source code THIS IS ONLY AN EXAMPLE but it works this way:
bool is_char(char c)
{
    switch(c)
    {
        case 'a':
            return true;
            break;
        .
        .
        .
        default:
            return false;
            break;
    }
}

现在我创建了另一个名为 is_token 的函数来查看我是否有一个非字母字符并且它可以部分工作。

bool is_token(char c) {
  switch (c) {
    case '\0':
        return false;
        break;
    case '{':
        return true;
        break;
    case '}':
        return true;
        break;
    case '=':
        return true;
        break;
    case ';':
        return true;
        break;
    default:
      return false;
  }
}

它在第一个';' 前只工作一次然后就彻底失败了。没有检测到什么。这是我尝试 lex 的代码:

int a;

int main()
{
    return a;
}

代码是这样工作的:

ifstream file;
//argv is the path
file.open(argv[1]);

vector<char*> words;
string line, code, word; 

while(getline(file, line))
{
    //I was just lazy and reused this loop
    code += line;
}

for(int i = 0; i < code.size(); i++)
{
    if(is_char(code[i]))
    {
        word += code[i];
    }else{
        words.push_back(word);
        word = "";
        if(is_token(code[i])){
            //Just so I know that i registered a Token
            words.push_back("Token");
        }
    }
}

for(int i = ; i < words.size(); i++)
{
    cout << words[i] << endl;
}

字母字符没有问题,但突然之间相同的算法因新字符而失效。我在这里监督什么吗?还是我认为它不起作用?

【问题讨论】:

  • 你的第一个函数是 void 而你是 return true; - 这永远不会起作用。
  • @Kay Steinhoff 我什么都不懂。你能提供一个最小的完整程序来演示这个问题吗?
  • 同样在文本文件中'\0' 永远不会出现。
  • @TedLyngmo 我的程序中有正确的返回类型,这只是在输入问题时出现错误,但感谢您指出我已将其编辑为正确的语法
  • @VladfromMoscow 我添加了一个如何使用代码的示例

标签: c++ string lex


【解决方案1】:

is_char():

bool is_char(char c)
{
    switch(c)
    {
        case 'a':
            return true;
            break;         // note: useless break
    }
}

如果您传递除a 之外的任何内容,该函数将不会返回bool,这会使程序具有未定义的行为。改变你的代码,让它总是返回一些东西:

bool is_char(char c)
{
    switch(c)
    {
        case 'a':
            return true;
    }
    return false;
}

【讨论】:

  • 这在运行时应该不会导致随机问题,但是会出现编译错误
  • @codeling 你可以实际编译程序 - 然后程序有未定义的行为
  • missing tailing return false; 表示这段代码有UB :P
  • @KaySteinhoff 答案已根据您的新问题进行了调整。
  • @codeling :-) 确实。 -Wall -Wextra -Werror -pedantic-errors 在学习 C++ 时应该是必填项。
【解决方案2】:

所以事实证明我只是增加了错误的值,它与我在这里显示的代码无关:D

但感谢所有回答我并试图提供帮助的人!下次我应该更正确地看待我的价值观:D

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2014-06-07
    • 1970-01-01
    • 2018-07-13
    • 2014-12-28
    相关资源
    最近更新 更多