【问题标题】:C++ How To Parse User's Input as Code to Execute? [closed]C ++如何将用户的输入解析为要执行的代码? [关闭]
【发布时间】: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)是什么吗?如果没有,也请研究一下。

标签: c++ string algorithm parsing


【解决方案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

【讨论】:

【解决方案2】:

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

  1. 定义终端
  2. 定义非终结符
  3. 定义生产规则

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

【讨论】:

  • 这一切都在 4 天内完成?
  • 4天是什么意思?
  • 使用计算器,所涉及的不仅仅是解析。还有优先级,例如,乘法和除法的优先级高于除法。在网上搜索“c++ 调车场算法”。
  • 是的,这涉及到很多事情,但首先必须构建解析树,然后可以应用操作优先级、左递归、左因式分解任何必要的语言...
猜你喜欢
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2011-06-20
  • 2011-08-31
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多