这个库起源于目前正在进行的一个研究项目。所有源代码都受到LGPL的保护,这意味着可以在任何项目(商业或非商业)中自由使用这些代码。
分词器使用分层映射结构来存储标记,并且应该和lexx一样快(至少是n*O(lexx))。分析器没有LALR(1)分析器的限制(如果使用得当),具有一些缓存能力,并允许解析字面量标记。它还支持优先级优先规则集。
所有项目都大量使用STL。由于MSVC6附带的STL实现并不是最佳选择,应该下载可在www.stlport.org免费获得的STL Port 4.5.1实现。已经设法消除了大部分C4786警告(提示:切换/FI)。
一个简单的表达式求值器的典型规则定义如下:
std::tstringstream init(
"
[seperators]\n"
"
200:+\n"
"
201:-\n"
"
202:*\n"
"
203:/\n"
"
204:^\n"
"
205:;\n"
"
206:(\n"
"
207:)\n"
"
' Whitespace tokens:\n"
"
0: \n"
"
0:\t\n"
"
0:\\n\n"
"
0:\\r\n"
"
[rules]\n"
"
300:numbers\n"
"
[grammar]\n"
"
401:{.expr}=100:{.expr}{$+}{.expr}\n"
"
402:{.expr}=100:{.expr}{$-}{.expr}\n"
"
403:{.expr}=99:{.expr}{$*}{.expr}\n"
"
404:{.expr}=99:{.expr}{$/}{.expr}\n"
"
405:{.expr}=98:{.expr}{$^}{.expr}\n"
"
406:{.expr}=0:{$(}{.expr}{$)}\n"
"
400:{.expr}=0:{!number}\n"
"
500:{.line}=0:{.expr}{$;}\n"
);
这初始化了分词器以识别分隔符'+','-','*','/','^',';','('和')',并跳过通常的空白字符,并初始化了分析器以识别数学规则'+,*,-,/,^',并声明'*'的优先级高于'+',例如。
通常只需要处理一个类,cxtPackage
。这个类导出了访问库所需的所有方法。其中一些是:
vSetInputStream()
- 设置输入流vSetDelimeterIDs()
- 可用于设置语句分隔符标记,在C++中这可以是';'nReadUntilDelimeter()
- 解析输入流,直到找到下一个分隔符标记或输入流的末尾papbCheckForRule()
- 分析标记流以给定的规则,并返回解析树(如果成功)vRebalance()
- 根据优先级优先规则重新排列解析树这些是最重要的。有关更多详细信息,请参见示例项目或查看页面http://www.subground.cc/devel,该页面将很快提供一些类下载的最少文档。
完整的下载中包含的新语法IDE提供了一个开发和测试分析器规则集的环境。它具有一些语法高亮显示功能,通过标记编辑器中的行显示错误,并有一个集成的测试环境来实时检查规则集的结果。还没有文档,IDE仍然是早期beta版,并且有一些外观错误(例如,可以通过剪贴板将RTF格式的文本插入到编辑器中),但大部分已经可以使用。
完整的下载中包括两个示例项目。一个是几乎为空的示例应用程序,可以轻松地用来探索库,另一个项目,simpleCalc
,展示了如何使用库在200行内构建一个简单的表达式求值器。
确保将项目cxTokenizer
,cxAnalyzer
和cxtPackage
插入到项目工作区。调整项目的依赖关系,使其依赖于cxtPackage
(它本身依赖于cxAnalyzer
,而cxAnalyzer
又依赖于cxTokenizer
)。
如果项目不使用MFC,必须包括文件common.cpp
,该文件位于项目文件的基本目录中。