我正在尝试为我出于个人原因设计的类似 C/C++/C#/Java/D 的编程语言编写扫描仪。对于这个任务,我使用 Ragel 来生成我的扫描仪。我无法准确理解许多操作员何时触发操作,这可能是因为我的学者专注于实践知识而不是理论,而且这种非确定性/确定性有限自动机业务的大部分内容都在我脑海中浮现。我发现文档要么缺乏,要么我对它的理解如此。我假设后者。
无论如何,我正在从基础开始。我在第一次迭代中确定了几个关键字和特殊字符。现在我遇到了所有关键字都被扫描为标识符的问题。我对所有关键字都使用了扫描仪运算符,因为这解决了我的字符串returns
被扫描为return
andreturns
关键字的问题。
如何正确扫描标识符?我知道要使这种确定性具有确定性,我需要有效地指定一个词位只能是一个,identifier
如果它不匹配其他令牌的模式。原谅我缺乏知识。
拉格尔脚本:
%%{
Identifier = (alpha | '_') . (alnum | '_')*;
action IdentifierAction
{
std::cout << "identifier(\"";
std::cout.write(ts, te - ts);
std::cout << "\")";
}
}%%
%%{
main :=
|*
Interface => InterfaceAction;
Class => ClassAction;
Property => PropertyAction;
Function => FunctionAction;
TypeQualifier => TypeQualifierAction;
OpenParenthesis => OpenParenthesisAction;
CloseParenthesis => CloseParenthesisAction;
OpenBracket => OpenBracketAction;
CloseBracket => CloseBracketAction;
OpenBrace => OpenBraceAction;
CloseBrace => CloseBraceAction;
Semicolon => SemicolonAction;
Returns => ReturnsAction;
Return => ReturnAction;
Identifier => IdentifierAction;
space+;
*|;
}%%