词法分析器项目 - 矢量输出不正确

时间:2017-03-25 06:18:34

标签: c++

我有以下代码,它是更大项目的一部分。这段代码应该做的是逐个字符地查找“令牌”。我在这段代码中寻找的令牌是一个ID。其中定义为一个字母后跟零个或多个数字或字母。

当检测到一个字母时,它进入内部循环并循环接下来的几个字符,将每个字符或字母添加到idstring,直到找到ID字符的末尾(在代码中定义),然后添加那个idstring到一个向量。在行的末尾,它应该输出向量的每个元素。我没有得到我需要的输出。我希望这是足够的信息来理解代码中发生的事情。如果有人可以帮我解决这个问题,我会非常满意。谢谢!

我需要的输出:ab:ab

我得到的结果:a:a

#include <iostream>
#include <regex>
#include <string>
#include <vector>

int main()
{
std::vector<std::string> id;

std::regex idstart("[a-zA-Z]");
std::regex endID("[^a-z]|[^A-Z]|[^0-9]");

std::string line = "ab ab";

//Loops character by character through the line
//Adding each recognized token to the appropriate vector
for ( int i = 0; i<line.length(); i++ )
  {
    std::string tempstring(1,line[i]);
    //Character is letter
    if ( std::regex_match(tempstring,idstart) )
      {
    std::string tempIDString = tempstring;
    int lineInc = 0;
    for ( int j = i + 1; j<line.length(); j++)
      {
        std::string tempstring2(1,line[j]);
        //Checks next character for end of potential ID
        if ( std::regex_match(tempstring2,endID) )
          {
        i+=lineInc+1;
        break;
          }
        else
          {
        tempIDString+=tempstring2;
        lineInc++;
          }
      }
    id.push_back(tempIDString);
      }       
  }

 std::cout << id.at(0) << " : " << id[1] << std::endl;
 return 0;
}

1 个答案:

答案 0 :(得分:1)

这个问题已有2.5年历史了,现在您看到它可能会笑了。找到第二个匹配的字符时,您break;内部for,因此您永远不会将tempstring2分配给tempstring1

但是让我们忘记那个代码。这里没有好的设计。

您有个使用std::regex的好主意,但您不知道它是如何工作的。

因此,让我们看一下正确的实现:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <regex>

// Our test data (raw string). So, containing also \n and so on
std::string testData(
R"#( :-)  IDcorrect1 _wrongID I2DCorrect
    3FALSE lowercasecorrect Underscore_not_allowed
i3DCorrect,i4 :-)
}
)#");

std::regex re("(\\b[a-zA-Z][a-zA-Z0-9]*\\b)");

int main(void)
{
    // Define the variable id as vector of string and use the range constructor to read the test data and tokenize it
    std::vector<std::string> id{ std::sregex_token_iterator(testData.begin(), testData.end(), re, 1), std::sregex_token_iterator() };

    // For debug output. Print complete vector to std::cout
    std::copy(id.begin(), id.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

    return 0;
}

这将通过定义范围构造函数来完成变量定义中的所有工作。因此,是典型的单线飞机。

希望有人可以从此代码中学习。 。