C ++如何将用户的输入解析为要执行的代码? [关闭]

Posted

技术标签:

【中文标题】C ++如何将用户的输入解析为要执行的代码? [关闭]【英文标题】:C++ How To Parse User's Input as Code to Execute? [closed] 【发布时间】:2020-08-03 20:57:16 【问题描述】:

重要提示:我不能使用外部代码或库,只能使用我自己用 C++11 编写的代码

我正在寻求实现一个图形计算器,它将用户输入作为字符串并将其转换为实际代码(执行它)。到目前为止,我已经完成了 operator+、operator- 等所有功能的实现……但我一直在解析用户输入。

例如,我想允许以下合法的命令

G1= a,b | <a,b>
G2    =    c,d | <c,   d>
print(G1)
print( G1+G2)
G1+G2+G3//will be interpreted as (G1+G2)+G3
G1+(G2+G3)

虽然以下不是:

print( G 1)
print (G2)()
pri nt (G1)
G1 + G 3

但是我该怎么做呢? (我在寻找想法,算法而不是代码)

首先,我考虑读取输入并从中删除多余的空格,但是像 pri nt (G1) 这样不合法的输入将是合法的。

其次,我考虑将所有合法命令保存在像 XprintX(XLegalExpressionGoesHereX)X 这样的表中,并在 X 出现的每个地方留出空格,但我也陷入了似乎不可能的事情

有什么建议吗?

【问题讨论】:

听起来你想实现一个分词器/词法分析器/解析器(查找这些术语)。也许还可以查找“野牛”.. 请看一下 Flex/Bison API for C++,它允许你做这些事情。 我推荐阅读一本关于解析器的书。还有一个是关于口译员的。 Boost Spirit Qi 也可能有用。 编写语言解释器不是简单的任务。你知道抽象语法树(AST)是什么吗?如果没有,也请研究一下。 【参考方案1】:

C++如何将用户的输入解析为代码执行?

如果您使用 C/C++ 从头开始​​编写自己的词法分析器/解析器,我建议您查看本教程,了解他们使用的方法。 看看前两章吧。

https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html

这个 YouTube 播放列表是一系列视频,讲述了一位讲师检查文章中的代码并实时编写代码。如果您更喜欢看别人的讲座,而不是仅仅阅读带有一些代码的文章。

https://www.youtube.com/playlist?list=PLSq9OFrD2Q3ChEc_ejnBcO5u9JeT0ufkg


如果你能理解的话,C 编译器设计也是一本好书。有很多细节,但可能是高级主题。

https://holub.com/goodies/compiler/compilerDesignInC.pdf

【讨论】:

起初,我不知道 OP 是什么意思。你是对的:他显然想要 a)解析一些“命令”,然后 b)“执行”它们,c)在 C++ 中同时进行“解析”和“执行”。您的链接:C++ How To Parse User's Input as Code to Execute? 是一个很好的建议! 别忘了臭名昭著的Dragon Book 这个 YouTube 播放列表是一系列视频,讲述了一位讲师检查文章中的代码并实时编写代码。 youtube.com/playlist?list=PLSq9OFrD2Q3ChEc_ejnBcO5u9JeT0ufkg 这里也是龙书的PDF版本。 ce.sharif.edu/courses/94-95/1/ce414-2/resources/root/…【参考方案2】:

如果您要实现计算器,首先您必须为该计算器语言定义Context Free Grammar(CFG)。声明CFG需要采取的步骤是:

    定义终端 定义非终结符 定义生产规则

想了解更多关于CFG的信息,您可以阅读this或查看Theory of computing上的一些书籍。然后,您可以在compiler/language design 上阅读一些书籍。但我认为,知道CFG 足以设计自己的简单语言。

【讨论】:

这一切都在 4 天内完成? 4天是什么意思? 使用计算器,所涉及的不仅仅是解析。还有优先级,例如,乘法和除法的优先级高于除法。在网上搜索“c++ 调车场算法”。 是的,这涉及到很多事情,但首先必须构建解析树,然后可以应用操作优先级、左递归、左因式分解任何必要的语言...

以上是关于C ++如何将用户的输入解析为要执行的代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

ANTLR - 如何确定哪种解析树“最适合”某些代码

如何将 ISR 设置为每秒运行 - C Atmega328p

如何从 JavaScript 中的用户输入将时间解析为 Date 对象?

如何将字符串里的变量作为PHP代码命令执行

c语言如何将用户输入的数字拆成独立的数字,比如用户输入123,就拆成1,2,3?谢谢

C语言程序是如何执行的