【问题标题】:C++ parsing as custom language InterpreterC++ 解析为自定义语言解释器
【发布时间】:2012-03-16 07:44:27
【问题描述】:

我需要将输入文本文件解析为自定义语言,我应该解释它的命令(逐行)并执行它,这是我应该期望的输入:

#Some variables
myInt = 2
myFloat = 2.5
myString = “Hello”

#Lists
myList = (myInt, myFloat, myInt + myFloat)
myOtherList = (myFloat + myFloat, myInt+ myInt)
subList = myList[:1]
completeList = myList + myOtherList + subList

#This should have no effect (it is ok if it is being calculated)
2+4

#Now some printing
print(myString)
print(“World”)
print(completeList)
print(completeList[3])

#Some syntax errors
b = “hello, this string is not enclosed right
c = myString + completeList
d = myInt + SOME_VARIABLE_I_HAVENT_DEFINED_YET

#First string to appear makes everything a string
print(1 + 2 + 15.5 + 2.2 + “Hi” + 3 + 4 + 6)
print(1 + 2 + 15.5 + 2.2 + 3 + 4 + 6 + “hi”)
print((1,2))

所以我已经有了第一个检查功能,现在我知道它什么时候是打印/分配/注释/错误语法命令或其他什么。我现在应该解析 print 函数和 assign 命令中的内容,我应该忽略空格,它们也可能不是值得依赖的分隔符。

请指导我一下,我应该使用哪些字符串函数以及如何使其工作,我的意思是如何切入标记并识别数学符号?我猜它应该使用一些堆栈来跟随列表类型和引号的括号,不是吗?任何一般和更详细的信息将不胜感激,谢谢(:

附言

这是这段代码的输出:

Hello
World
(2, 2.5, 4.5, 5.0, 4, 2, 2.5)
5.0
InvalidSyntax : b = “hello, this string is not enclosed right
InvalidSyntax : c = myString + completeList
UndefinedVariableName : SOME_VARIABLE_I_HAVENT_DEFINED_YET
20.7Hi346
33.7hi
(1,2)

我已经拥有了我需要的所有重载运算符,我只需要正确解析它并将其发送到我已经构建的函数。

【问题讨论】:

  • 大写句子会不会太麻烦?
  • 是的,发明语法的人应该使用正确的大小写。另外,请注意您已将大引号 粘贴到您的示例中;这可能不是编程语言的意图。此外,这些示例使它看起来像具有厨房功能的通用语言。从简单开始,例如先做算术表达式,然后通过简单的赋值添加命名变量……如果没有界定语言应该解决的问题,这不是一个真正的问题。
  • 我把我的句子大写了,关于引号的事情,这就是我对字符串类型的期望。
  • 你想走多远?解释器只会读取和执行(这似乎很好,因为这里没有函数),而您也可以更多地参与并创建各种翻译步骤(令牌、AST、IR、可执行文件)。
  • 这是一个关于多态性的赋值,那些 INT,FLOAT,STRING 和 LIST 类型是我的类型,每个类型都包含相关的真实类型,我们使用 map 来存储这些 vars,我们对它们进行操作。

标签: c++ string file parsing input


【解决方案1】:

所以你还没有机会阅读the Dragon Book...

您如何看待将 Lua 或 Python 解释器嵌入到您的产品中,而不是发明自己的语言?它们是更常见和成熟的编程语言。此外,Google 会帮助您找到很多关于如何嵌入它们的教程,例如:

发明自己的语言的缺点是:即使成功解析了自己的语言,也需要为其定义语义。解析只处理 syntax,这与语义不同。我不知道你的情况,但是对于一个软件项目,他们通常都需要很长时间来学习。

至于Boost Spirit:我不建议使用它,它是由那些只想通过编写它来展示自己的聪明才智的人编写的(但最终表明他们对什么是实用的软件设计的无知。)

【讨论】:

    【解决方案2】:

    为此存在一个很棒的 C++ 库:SPIRIT

    【讨论】:

    • 我不太确定精彩(编译错误很可怕),但它确实是有效的。
    • 和很多boost子库一样,唯一觉得我能理解的编译错误信息,就是我文件中出现错误的那一行:)
    • 我不能用那个,我应该自己解析,而且它看起来也太复杂了,不适合我的需要,谢谢。
    • @MatthieuM。你说“它肯定是有效的”是什么意思?您是否将它与good old BisonLemonANTLR 等其他替代方案进行了比较?在您的基准测试结果中,它比竞争对手的效率高多少倍?
    • @nodakai:我会让ApochiQ speaks about this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2018-12-15
    相关资源
    最近更新 更多