gpt4 book ai didi

lexical-analysis - 如何使用 Ragel 正确扫描标识符

转载 作者:行者123 更新时间:2023-12-04 07:22:16 25 4
gpt4 key购买 nike

我正在尝试为我出于个人原因而设计的 C/C++/C#/Java/D 之类的编程语言编写扫描仪。对于这个任务,我使用 Ragel 来生成我的扫描仪。我无法准确理解许多操作符何时触发 Action ,可能是因为我的学者专注于实践知识而不是理论,而且很多这种非确定性/确定性有限自动机业务都在我的脑海中。我发现文档要么缺乏,要么我对它的理解就是这样。我假设是后者。

无论如何,我正在从基础开始工作。我在第一次迭代中确定了几个关键字和特殊字符。现在我遇到了所有关键字都被扫描为标识符的问题。我对所有关键字都使用了扫描仪运算符,因为这解决了我的字符串 returns 问题。被扫描为 returnreturns关键词。

如何正确扫描标识符?我知道要使这种确定性,我需要有效地指定一个词位只能是 identifier如果它不匹配其他 token 的模式。原谅我知识匮乏。

雷格尔脚本:

%%{
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+;
*|;
}%%

最佳答案

不熟悉 Ragel,但做过一些自定义解析器和扫描器。

您的问题似乎更多地与检测关键字有关,而不是检测通用标识符。

您有规则告诉 Ragel 检测代码何时是数字、“return”关键字、分号、“returns”关键字、标识符等。 Altought,可以为每个关键字制定规则,我不推荐。

我从经验中学到的是,最好阅读所有关键字明确作为标识符 (分配一个通用的“标识符”标记),并在您的 C/C++ 代码的某些部分,检测哪些标识符是“关键字”。

换句话说。 Ragel 将只检测标识符。 “myvar”、“return”和“returns”都将被标记为“标识符”。稍后,在您的语义 Action 的代码中( C/C++ not Ragel ),您将检查每个标识符,并检测是否是 C/C++ 中的关键字。这通常是通过关键字列表来完成的。

我认为它会是这样的:

%%{
Identifier = (alpha | '_') . (alnum | '_')*;
action IdentifierAction
{
String Keywords[] =
(
"return",
"if",
"else"
);

String MyIdentifier = te - ts;
if (SearchKeywordCode(Keywords, MyIdentifier)) {
std::cout << "keyword(\"";
std::cout.write(ts, te - ts);
std::cout << "\")";
}
else {
std::cout << "identifier(\"";
std::cout.write(ts, te - ts);
std::cout << "\")";
}
}
}%%

因此,没有“退货”或“退货”规则,只有“标识符”。

关于lexical-analysis - 如何使用 Ragel 正确扫描标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5211716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com