c++ - 运行时用户输入解析

标签 c++ parsing runtime

我正在尝试创建一个运行时解析器,它可以识别给定语言的关键字或用于语法突出显示。我知道如何设计和实现一个简单的有限状态机,但问题是实时解析用户输入。从控制台来看,这很简单,我只需在用户按 Enter 后调用 getline() 并逐个字符地迭代字符串。但在 GUI 环境中我无法弄清楚如何实时解析。现在,我首先在 Metro 风格应用程序中创建一个简单的文本框,然后通过触发 textchanged 事件,我将获取用户输入,将其存储到字符串中,然后将其发送到词法分析器进行解析。

void InterpreterMetro::MainPage::EditWindow_TextChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::TextChangedEventArgs^ e)
{
    String ^ input = "";
    input = EditWindow -> Text;

    // Send the string to the lexer for parsing
    m_lexer.Initialize( input )
}

在我的词法分析器中,我执行以下操作:

void Lexer::Initialize( std::wstring input )
{
    // Store the current input string
    m_input = input;

    // Get the next character in the input
    NextCharacter();

    // Analyze the current input character
    Scan();
}

在我的扫描函数中,我有一个由 switch 语句实现的简单有限状态机

Token Lexer::Scan()
{
    State = Initial;

    while( State != Exit )
    {
        switch( State )
        {
            case Initial:
                {
                    if( m_peek == '>' ){ State = Greater; }
                    else{ State = Exit; }
                } break;

            case Greater:
                {
                    NextCharacter();
                    if( m_peek == '='){ State = GreaterEqual; }
                    else{ return m_token.GREATER; }
                } break;

            case GreaterEqual:
                {
                    NextCharacter();
                    return m_token.GREATEREQUAL;
                } break;
        }
    }
}

我遇到的主要问题是,当我调用函数 NextCharacter() 来确定它是 > 还是 >= 时,该字符会通过开关并绕过 nextcharacter 函数,因为它不等待下一个输入。但我不知道如何解决这个问题。这是我的 NextCharacter() 函数:

void Lexer::NextCharacter()
{
    std::wstring::iterator iterator = m_input.begin();

    for( iterator; iterator != m_input.end(); ++iterator )
    {
        m_peek = *iterator;
    }
}

我一直在寻找一种解决方案,了解如何实时收集用户输入并对其进行迭代,以便在文本编辑器等环境中的运行时解析器中使用。我发现的所有内容都是基于控制台的,但基于 GUI 的情况有很大不同。有人能指出我正确的方向吗?最好的方法是什么?有没有更好的方法让用户在运行时解析器中输入?我的处理方式完全错误吗?

最佳答案

我认为 NextCharacter() 唯一的问题是扫描整个输入字符串,始终返回最后一个字符。您最好在词法分析器中存储“当前”迭代器,并在到达输入字符串的 end() 时停止。

在词法分析器类中:

class Lexer
{
   ... your current code...

private:
    std::wstring m_input;
    std::wstring::iterator m_it;
};


Lexer::Lexer()
   : m_input("")
   , m_it(m_input.end())
{
}


void Lexer::Initialize(const std::wstring& input)
{
    m_input = input;
    m_it = m_input.begin();
}

bool Lexer::NextCharacter()
{
    if (m_it != m_input.end())
    {
        m_peek = *m_it++;
        return true;
    }
    return false;
}

类似这样的事情。在输入字符串拷贝旁边保留当前输入的迭代器。我在网页上锤炼了这个,所以肯定会有错误,但我希望你明白。

关于c++ - 运行时用户输入解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13242126/

相关文章:

java - 代码执行时项目没有响应

java - 检查 Struts 状态运行时

c++ - 如何修复称为运行时错误的纯虚函数?

linux - iperf 结果的 Bash 脚本平均值

android - 如何在没有成员标签的情况下将 JsonElement 转换为 Json?

c - 将包含数字和字母的字符串放入结构中的 int 指针中

c# - .NET 4 中的 StackOverflowException

c++ - 将 1 个 cpu 核心分配给 1 个线程 c++

c++ - 将字符串(字符)发送到事件窗口

c++ - 随 secret 码生成器上的 OpenMP 多线程