我正在尝试创建一个运行时解析器,它可以识别给定语言的关键字或用于语法突出显示。我知道如何设计和实现一个简单的有限状态机,但问题是实时解析用户输入。从一个简单的控制台,我只需在用户按下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()函数:
void Lexer::NextCharacter()
{
std::wstring::iterator iterator = m_input.begin();
for( iterator; iterator != m_input.end(); ++iterator )
{
m_peek = *iterator;
}
}
我一直在寻找如何实时收集用户输入并在文本编辑器(如环境)中使用运行时解析器进行迭代的解决方案。我发现的一切都是基于控制台的,但基于GUI的情况则大不相同。任何人都可以指出我正确的方向,最好的方法是什么?有没有更好的方法让用户在运行时解析器中输入?我这样做的方式完全错了吗?
答案 0 :(得分:2)
我唯一看错的是你的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;
}
这样的事情。在输入字符串副本旁边保留当前输入的迭代器。我在网页上敲了这个,所以肯定会有错误,但我希望你明白这个想法。