繁体   English   中英

简单代码解析器的设计策略

[英]Design strategy for a simple code parser

我试图编写一个应用程序以从专有IDE设计文件中提取属性和代码。 文件格式如下所示:

HEADING
{
  SUBHEADING1
  {
    PropName1 = PropVal1;
    PropName2 = PropVal2;
  }

  SUBHEADING2
  {
    { 1 ; PropVal1 ; PropValue2 }
    { 2 ; PropVal1 ; PropValue2 ; OnEvent1=BEGIN
                                             MESSAGE('Hello, World!');
                                             { block comments are between braces }
                                             //inline comments are after double-slashes
                                           END; 
    PropVal3 }
    { 1 ; PropVal1 ; PropVal2; PropVal3 }
  }
}

我想做的是提取子标题下的内容。 在SUBHEADING2的情况下,我还要将每个标记分隔为分号。 仅计算括号并跟踪我目前所从事的子标题,我就取得了相当不错的成功。 我遇到的主要问题涉及处理代码注释。

这种语言碰巧使用{}进行块注释,这会干扰文件格式中的括号。 为了使其更加有趣,还需要考虑双斜线内联注释,并忽略行尾的所有内容。

解决这个问题的最佳方法是什么? 我看了另一篇文章中讨论过的一些编译器库(ANTLR,Doxygen等),但是对于解决这个特定的解析问题,它们似乎有些过头了。

我建议写一个标记器和解析器。 这将为您提供更大的灵活性。 分词器基本上对源代码进行简单的文本分解,并将其放入更可用的数据结构中; 解析器通常会利用递归来弄清楚该怎么做。

Google专用术语:令牌生成器,解析器,编译器设计,语法

数学表达式评估器: http : //www.codeproject.com/KB/vb/math_expression_evaluator.aspx (您可以举一个这样的例子,然后将其分解为所需的内容)

有关解析的更多信息: http : //www.codeproject.com/KB/recipes/TinyPG.aspx

您不必走那么远的篇幅,但是,您将需要先对此进行一些研究。

使用正则表达式以及使用结果的一些代码,您应该可以在几个小时内将某些内容放在一起。

这样的事情应该起作用:-通过将文件加载到字符串中来初始化该过程。

  • 使用正则表达式标记从字符串中提取每个顶级块,以分别标识block关键字和内容。
  • 如果找到一个块,
    • 根据关键字做出决定
    • 将内容递归传递给此过程。

之后,您将处理HEADING,然后处理第一个SUBHEADING,然后处理第二个SUBHEADING,然后处理每个子块。 对于包含该块注释的子块,您可能会基于该块缺少关键字而知道任何子块都是注释,因此无需处理这些子块。

无论您选择哪种解决方案,我都可以肯定,最好的方法是拥有2个解析器/令牌器。 一种用于以{}作为分组字符的主文件结构,另一种用于代码块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM