65.9K
CodeProject 正在变化。 阅读更多。
Home

支持优先规则的标记器和分析器包

2001年6月14日

3分钟阅读

viewsIcon

189538

downloadIcon

2835

一个库,允许您方便地构建支持优先规则的自定义标记器和分析器。

grammarIDE   Evaluation

引言

这个库源于我目前正在进行的一些研究项目。所有源代码都受 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 提供了一个开发和测试分析器规则集的环境。 它具有一些语法突出显示功能,通过在编辑器中标记行来显示错误,并具有一个集成的测试环境来实时检查规则集的结果。 我还没有任何文档,并且 IDE 仍处于早期 beta 阶段,并且有一些外观错误(例如,可以通过剪贴板将 RTF 格式的文本插入到编辑器中 :-)),但大部分已经可以使用。

示例项目

完整下载中包含两个示例项目。 一个是几乎为空的示例应用程序,您可以轻松地使用它来探索该库,另一个项目 simpleCalc 展示了如何使用该库在 200 行中构建一个简单的表达式求值器。 有关该示例如何工作的逐步说明 在这里

如何在自己的项目中使用它

确保将项目 cxTokenizercxAnalyzercxtPackage 插入到您的项目的工作区中。 调整您的项目的依赖项以依赖于 cxtPackage(它本身依赖于 cxAnalyzer,而 cxAnalyzer 又依赖于 cxTokenizer)。 如果您的项目不使用 MFC,则必须包含文件 common.cpp,该文件位于项目文件的基本目录中。 如果您有任何问题,请随时发送邮件至 alexander-berthold@web.de。 有关最新更新,另请参阅 http://www.subground.cc/devel

更新

  • 2002-01-02
    现在包含 C++(无模板和预处理器)语法。 另请参阅 此处
  • 2001-12-29
    修复了分析器中的一个小错误。 IDE 下载现在包含一个尚未完成的 C 语法。
  • 2001-12-27
    已更新主页 URL 到无广告主机。
  • 2001-12-26
    上传了新版本,其中包括 grammarIDE 和分析器中的一些增强功能。
© . All rights reserved.