运行时用户输入解析
Run-time User Input Parsing
我正在尝试创建一个可以识别给定语言的关键字或用于语法突出显示的运行时解析器。我知道如何设计和实施一台简单的有限状态机,但是问题是实时解析用户输入。从控制台中,我只需在用户输入并通过字符串按字符的字符来迭代并迭代字符之后,我只会致电getline()。但是在GUI环境中,我无法弄清楚如何实时解析。目前,我首先在Metro Style应用程序中创建一个简单的文本框,然后触发文本交换事件,我将获得用户输入,将其存储到字符串中,然后将其发送到Lexer进行解析。
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 )
}
在我的Lexer内部,我执行以下操作:
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()以确定其a>或> =是否会贯穿开关并绕过nextcharacter函数,因为它不等待下一个输入。但是我不知道如何解决这个问题。这是我的nextcharacter()函数:
void Lexer::NextCharacter()
{
std::wstring::iterator iterator = m_input.begin();
for( iterator; iterator != m_input.end(); ++iterator )
{
m_peek = *iterator;
}
}
我一直在寻找有关如何实时收集用户输入的解决方案,并遍历它在运行时间解析器(如环境)中的运行时间解析器中使用。我发现的一切都是基于控制台的,但是GUI基于控制台大不相同。有人可以以正确的方向向我指出正确的方向?是否有更好的方法可以在运行时解析器中输入用户?我在这样做的方式上完全错了吗?
我唯一发现您的nextcharacter()唯一错误的是扫描整个输入字符串,总是返回最后一个字符。您最好将"当前"迭代器存储在Lexer中,并在到达输入字符串的末端()时停止。
在类Lexer中:
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++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 用户定义函数中的指针和输入
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 在C++中,我如何接受不同于同一行的用户输入
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 当用户键入分隔符时,停止getline()输入
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 当用户在qtablewidget中输入单元格时,如何获得信号?C++
- 显示基于用户输入的整数的字符
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 如果用户没有输入任何内容或输入错误,如何重新输入用户的输入?
- 为什么在代码块中执行时会跳过输入用户输入的行?
- 使用 for 循环在数组中输入用户