gpt4 book ai didi

c++ - 解析与char c++相关的整数

转载 作者:行者123 更新时间:2023-11-28 05:51:40 24 4
gpt4 key购买 nike

我正在做一个项目,该项目从文件中的公式读取一些字符串 react ,例如:(5A+3B=c+10D) 作为输入。我需要对字符串 react 进行解析,以便我可以在 char 旁边提取 &(split) 整数值并将它们放入 vector 中,即与此处的 react 关联的 vector 是:[5 3 1 10]。我考虑过 std::strtok 函数,但我认为它不能分隔整数值!!! 谁能帮我 ??这是我的尝试:

int main()
{
std::string input;
std::getline(std::cin, input);
std::stringstream stream(input);
while(1) {
int n;
stream >> n;
char * pch;

pch = strtok (input," ");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.");
}
return 0;
}
}

最佳答案

要进行一些认真的解析工作,您需要学习一些语言理论。幸运的是,这不是很困难。

我们将在此处介绍的方法称为自顶向下递归解析。

此处完整的源代码 list 对于本论坛的目的来说太长了,相反,我将提供一些伪代码。

您需要做的第一件事是定义语法。什么被认为是有效的,什么不是,你代表这样的语法:

formula := term 
:= term + formula
:= term - formula
term := variable
:= coefficient variable

所以一个公式 C + 2D 可以表示为

formula
term
variable
C
+
formula
term
coefficient
2
variable
D

考虑到这一点,我们首先解决一个更简单的问题,我们只需要输入字符串中的几类东西

+
-
coefficient
variable

只有这四个东西是有效输入,你可能想跳过空格。把输入的字符串拆分成这4类东西,就叫词法分析。我们通常会实现所谓的扫描仪来执行此操作。

扫描仪通常是这样的

class Scanner
{
public:
Scanner(const char* text);
Token GetToken(); // The current token
void Scan(); // read the next token
}

接下来,您需要将这些 token 分组到一棵树中,就像我在上面向您展示的那样。我们通常将此逻辑称为解析,并将其实现为解析器。您可以通过多种方式实现解析器,这是您可以使用自上而下的预测解析器实现的一种方式

class Parser
{
public:

private:
bool ParseVariable()
{
if (s.GetToken() is variable) { s.Scan(); return true; }
}
bool ParseTerm()
{
if (s.GetToken() is variable) { s.Scan(); return true; }
if (s.GetToken() is coefficient) { s.Scan(); return this->ParseVariable(); }
}
Scanner s;
}

类似的代码还在继续。显然,可以扩展那些 Parse() 方法的返回类型以返回对其调用者有用的东西,并组装您需要的表示形式。

出于个人目的,我为不同的语言编写了一些解析器。您可以将它们作为样本查看。

这是一个 Python 示例。 https://github.com/cshung/MiscLab/blob/master/GreatestCommonDivisor/polynomial_module.py

这是 C++ 中的一个示例,有一点小改动,我向后解析字符串以避免“左递归” https://github.com/cshung/Competition/blob/master/Competition/LEET_BASIC_CALCULATOR.cpp

要在实际产品中查看自上而下的解析器,请参阅 ChakraCore 中的这个示例,我很自豪地在前一段时间工作过。 https://github.com/Microsoft/ChakraCore/blob/master/lib/Parser/Parse.cpp

关于c++ - 解析与char c++相关的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35145295/

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