【发布时间】: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 我添加了一个如何使用代码的示例