如何在 C++ 中解析命令树?
How to parse command tree in C++?
我正在用 C++ 编写一个控制台应用程序,我需要获取类似 shell 的用户命令系统来配置应用程序中的选项。例如,用户可以这样写:
注册 姓名
连接 打开 [远程登录 | ssh]
连接 切换 telnet
发送 文本
连接 切换 ssh
发送 文本
...等等...
所以,很明显我们有一些命令树,在上面的例子中我们有:
--register
|
--connetion
| |--open
| |--switch
|
--send
每个命令可以有不同数量的参数。
问题:
- 如何解析这样的命令树?
现在我用正则表达式来解析,但是这个方案真的很丑。我读过有关 YACC 和 LEX 的资料,但我不确定使用它是否是一个真正的好主意。
是否有一些广泛使用的方法来解析命令树?我对词法分析理论不是很了解,所以如果你能不学术地回答我将不胜感激。
如果您可以使用 GNU C 库,This 是一个很好的资源,有几个选项。
最后你会想要切换每个 arg,你可能需要跟踪你的嵌套命令的一些状态。
使用您的示例 arg 树:
switch (arg)
{
case "register":
{
register = 1;
break;
}
case "connection":
{
connection = 1;
break;
}
case "open":
{
if (previousCommand == "connection")
connectionOpen = 1;
else
//error
break;
}
case "switch":
{
if (previousCommand == "connection")
connectionSwitch = 1;
else
//error
break;
}
case "send":
{
send = 1;
break;
}
previousCommand = arg;
}
我正在用 C++ 编写一个控制台应用程序,我需要获取类似 shell 的用户命令系统来配置应用程序中的选项。例如,用户可以这样写:
注册 姓名
连接 打开 [远程登录 | ssh]
连接 切换 telnet
发送 文本
连接 切换 ssh
发送 文本
...等等...
所以,很明显我们有一些命令树,在上面的例子中我们有:
--register
|
--connetion
| |--open
| |--switch
|
--send
每个命令可以有不同数量的参数。
问题:
- 如何解析这样的命令树?
现在我用正则表达式来解析,但是这个方案真的很丑。我读过有关 YACC 和 LEX 的资料,但我不确定使用它是否是一个真正的好主意。
是否有一些广泛使用的方法来解析命令树?我对词法分析理论不是很了解,所以如果你能不学术地回答我将不胜感激。
This 是一个很好的资源,有几个选项。
最后你会想要切换每个 arg,你可能需要跟踪你的嵌套命令的一些状态。
使用您的示例 arg 树:
switch (arg)
{
case "register":
{
register = 1;
break;
}
case "connection":
{
connection = 1;
break;
}
case "open":
{
if (previousCommand == "connection")
connectionOpen = 1;
else
//error
break;
}
case "switch":
{
if (previousCommand == "connection")
connectionSwitch = 1;
else
//error
break;
}
case "send":
{
send = 1;
break;
}
previousCommand = arg;
}