固定循环结构以生成令牌

时间:2014-10-23 11:35:47

标签: c++ if-statement for-loop

在函数读取字符串后尝试生成许多标记。

该程序是HTML词法分析器的一部分,我只想弄清楚逻辑。

对于如下字符串:字符串:"标题到达此处< / =>标题" 输出应为:TEXT LANGLE SLASH EQUAL SLASH TEXT END

含义之前的任何内容<>被认为是一个文本标记。当我在里面<,我有其他情况。当字符串结束时,生成END令牌

我的问题是,该程序陷入无限循环的END令牌。我知道我犯了一些愚蠢的错误,但我可以为我的生活弄清楚。

#include <iostream>
#include <fstream>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

void gettoken()
{
    string wordin="there you were<=/>there";

    for(unsigned int i = 0; i < wordin.length(); )
    {

        if(wordin.at(i)== '<') 
        {
            cout<<("LANGLE")<<endl;
            i++;
            {
                if(wordin.at(i)== '=') 
                {
                    i++;
                    cout<<("EQUAL")<<endl;
                }

                if(wordin.at(i)== '/')
                {
                    i++;
                    cout<<("SLASH")<<endl;
                }

                if(wordin.at(i)== '>')
                {
                    i++;
                    cout<<("RANGLE")<<endl;
                }


            } // internal LANGLE ends here

        }

        else if (isalpha(wordin[i])) {
            unsigned int j=wordin.find('<') ;
            i=j;

            cout<<"TEXT"<<endl;}

        }
        cout<<"END"<<endl;

    }


int main()
{
    gettoken();
}

更新: 我修改了一些代码,现在它生成了TEXT LANGLE SLASH EQUAL LANGLE TEXT LANGLE SLASH EQUAL LANGLE等等,它应该像TEXT LANGLE SLASH EQUAL LANGLE TEXT END ..有人帮我解决了如何正确终止它。

1 个答案:

答案 0 :(得分:3)

你在else语句中缺少一个i ++(输出“END”的那个)。这会导致无限循环。

在这种情况下,使用调试器比使用stackoverflow更快。

您的代码还有许多其他问题。考虑: - 使用智能缩进,否则,它很难阅读 - 使用调试器找出错误而不是将代码发布到stackoverflow ...; - )

这是一个有效且可读的代码:

#include <iostream>
#include <fstream>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>

using namespace std;

void gettoken()
{
    string wordin="there you were<=/>there";

    bool inTag = false;
    for(unsigned int i = 0; i < wordin.size(); )
    {
        if(wordin.at(i)== '<') 
        {
            cout<<("LANGLE")<<endl;
            i++;
            inTag = true;
        }
        else if ( inTag && wordin.at(i)== '=' ) 
        {
            i++;
            cout<<("EQUAL")<<endl; 
        }
        else if ( inTag && wordin.at(i)== '/' )
        {
            i++;
            cout<<("SLASH")<<endl;
        }
        else if ( inTag && wordin.at(i)== '>' )
        {
            i++;
            cout<<("RANGLE")<<endl; 
            inTag = false;
        }
        else if (isalpha(wordin[i])) 
        {
            unsigned int j = wordin.find('<',i) ;
            if ( j == std::string::npos )
            {
                i = wordin.size(); // move to end of string position
            }
            else
            {
                i=j;
                cout<<"TEXT"<<endl;
            }
        }
    }
    cout<<"END"<<endl; 
}


int main()

{
    gettoken();
}

输出:

TEXT
LANGLE
EQUAL
SLASH
RANGLE
TEXT
END

希望这是你想要的......