2010-10-28 93 views
2

我在C++中有一个应用程序,它实际上处理二进制文件。二进制文件是A/B/C事件的集合,当检测到文件中的事件A时,应用程序在“处理程序A”中处理事件。如何解释自定义语言

现在我需要用自定义语言编写另一个脚本,该脚本与二进制文件处理正交执行。该脚本可以有这样的事,

define proc onA 
{ 
c= QueryVariable(cat) 
print (c) 
} 

所以当应用程序处理来自二进制文件的事件“A”,应用程序必须分析这个脚本文件,检查ONA和转换在奥纳PROC到例程声明由应用程序支持。例如,QueryVariable应该将应用程序中定义的变量“cat”的值复制到变量“C”中。该应用程序还应该检查脚本中语言的语法/语义。我在哪里可以获得决定设计的最佳信息?我在分析树木/语法方面的知识真的被削弱了。

谢谢

+0

设计的哪些部分受您控制?你可以修改应用程序吗? – Beta 2010-10-28 16:19:14

+1

我不清楚你是否需要编写解释器。如果你[学会编写编译器](http://stackoverflow.com/q/1669/2509)是指针的标准来源。 – dmckee 2010-10-28 16:29:36

+0

@ beta是我可以修改应用程序。解析和理解脚本的整个逻辑应该驻留在应用程序 – excray 2010-10-28 17:15:50

回答

2

一个简单的方法来构建一个解释:

  • 定义解析器从语法的语言
  • 建立一个抽象语法树AST
  • 应用访问者的功能是遍历序的AST和“执行”AST节点建议的操作。

一些AST节点将是“定义”的,例如,将声明某个命名实体的存在,例如上面的“define proc onA”短语。典型地,动作是将指定的实体与内容相关联,例如,形成三元组onA,proc,<主体> >,并将其存储在由第一条目索引的符号表中。这使得找到这样的定义更容易。以后,当你的事件过程遇到一个A事件时,你的应用程序知道在这个符号表中查找“onA”。当发现时,访问者函数遍历AST来执行其内容。您通常需要一个值栈来记录中间表达式值,AST叶代表操作数(变量,常量)将值推送到堆栈上,操作符(+, - ,< =)将弹出的值关闭并计算新的结果推送。赋值操作将顶层堆栈值放入与标识符名称关联的符号表中。控制操作员(如果,确实)从堆栈顶部取值,并使用它们来指导下一步要执行的程序的哪一部分(例如,哪个子树)。

所有这些都是众所周知的,可以在大多数关于编译器和解释器的书中找到。彼得布朗的这本书是特别好的,尽管它看起来相对较旧:

Writing Interactive Interpreters and Compilers

1

必须有一些脚本语言的解释器或编译器。检查它是否支持在C或C++中嵌入。大多数脚本语言都可以

接下来的选择,或者也许是第一种,只是使用现有的编译器/解释器在外部运行脚本。

我想不出为什么前两个选项中的一个选项不行,但如果不行的话,可以考虑使用ANTLR或小语言Boost Spirit构建一个解释器。免责声明:我没有使用第一个,我只是尝试了一个小型玩具的Boost Spirit例子。

干杯&心连心,

PS:如果你可以选择的脚本语言,可以考虑JavaScript和只使用谷歌的报道优秀嵌入API。

+0

从它的声音来看,前两种选择不会做,因为他发明了自己的脚本语言。我当然同意你的帖子脚本。 – JoshD 2010-10-28 16:19:49

+0

没错。这是我自己的语言 – excray 2010-10-28 17:14:24