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 ++如何将用户的输入解析为要执行的代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 ISR 设置为每秒运行 - C Atmega328p
如何从 JavaScript 中的用户输入将时间解析为 Date 对象?