gpt4 book ai didi

c++ - 简单(moSTLy)变量解析器

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:05:36 26 4
gpt4 key购买 nike

在我的一个项目中,我需要能够提供一个非常简单的变量查找和替换解析器(主要用于路径)。变量主要在启动期间使用,偶尔用于访问文件(不是程序的主要功能,只是加载资源),因此解析器不需要高性能。但是,我非常希望它是线程安全的。

解析器需要能够存储一组变量(目前为 map<string, string>)并能够用字符串中的相应值替换标记。变量值可能包含其他变量,这些变量将在使用变量时解决(添加时不会,因为变量可能会随着时间的推移而添加)。

当前的变量语法看起来像这样:

$basepath$/resources/file.txt
/$drive$/$folder$/path/file

我当前的解析器使用一对 stringstream s(“output”和“varname”),写入“output”流直到找到第一个 $,写入“varname”流直到找到第二个 $,然后查找变量(使用 varname.str() 的内容)。它非常简单并且运行良好,即使在对变量值进行递归时也是如此。

String Parse(String input)
{
stringstream output, varname;
bool dest = false;
size_t total = input.length();
size_t pos = 0;
while ( pos < total )
{
char inchar = input[pos];
if ( inchar != '$' )
{
if ( dest ) output << inchar;
else varname << inchar;
} else {
// Is a varname start/end
if ( !dest )
{
varname.clear();
dest = true;
} else {
// Is an end
Variable = mVariables.find(varname.str());
output << Parse(Variable.value());
dest = false;
}
}

++pos;
}

return output.str();
}

(错误检查等删除)

但是,当我尝试将它应用到我想要的语法时,该方法失败了。我想要类似于 Visual Studio 用于项目变量的东西:

$(basepath)/resources/file.txt
/$(drive)/$(folder)/path/file

我也希望能够做到:

$(base$(path))/subdir/file

在变量名中递归让我陷入困境,我不确定继续进行的最佳方式。

目前,我有两个可能的概念:

遍历输入字符串,直到找到 $,寻找 ( 作为下一个字符,然后找到匹配的 )(计算进出级别,直到达到正确的关闭 paran)。发送该位进行解析,然后使用返回值作为变量名。然而,这看起来会很困惑并导致大量复制。

第二个概念是使用 char * ,或者可能是 char * & ,然后向前移动,直到我到达一个终止的空值。解析器函数可以在解析变量名称时在对自身的递归调用中使用指针。我不确定如何最好地实现这项技术,除了让每个调用跟踪它解析出的名称,并附加它进行的任何调用的返回值。

该项目只需要在 VS2010 中编译,因此 STL 流和字符串、C++0x 的支持位以及 Microsoft 特定的功能都是公平的游戏(如果这些要求发生变化,通用解决方案更可取,但事实并非如此在这一点上是必要的)。但是,使用其他库并不好,尤其是 Boost。

我的两个想法似乎都比需要的更复杂、更困惑,所以我正在寻找一种干净利落的方式来处理这个问题。非常欢迎讨论如何最好地做到这一点的代码、想法或文档。

最佳答案

简单的解决方案是搜索字符串中的第一个')',然后向后移动以查看是否有以“$(”开头的标识符。如果有,请替换它并重新开始扫描。如果没有找到"$("identifier,然后找到下一个 ')' - 如果没有,你就完成了。

解释一下:通过搜索 ),您可以确定您正在为您的替换找到一个完整的标识符,然后它有机会为后续替换中使用的其他标识符做出贡献.

例子

Had a great time on $($(day)$(month)), did you?

Dictionary: "day" -> "1", "month" -> "April", "1April" -> "April Fools Day"

Had a great time on $($(day)$(month)), did you?
^ find this
Had a great time on $($(day)$(month)), did you?
^^^^^^ back up to match this complete substitution
Had a great time on $(1$(month)), did you?
^ substitution made, restart entire process...
Had a great time on $(1$(month)), did you?
^ find this
etc.

关于c++ - 简单(moSTLy)变量解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5534029/

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