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

时间:2009-05-27 18:13:17

标签: c# parsing compiler-construction

我正在尝试编写一个应用程序来从专有的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等)中讨论的一些编译器库,但它们对解决这个特定的解析问题似乎有些过分。

3 个答案:

答案 0 :(得分:5)

我建议编写一个标记器和解析器;这会给你更多的灵活性。标记器基本上对源代码进行简单的文本分解,并将其置于更有用的数据结构中;解析器通常利用递归来计算如何处理它。

google的条款:tokenizer,解析器,编译器设计,语法

数学表达式评估员:http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx (你或许可以举一个像这样的例子,把它分成你想要的东西)

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

你不必走得那么远,但是,你会想要先研究一下这篇文章。

答案 1 :(得分:1)

你应该能够在几个小时内将一些东西放在一起,使用正则表达式和一些使用结果的代码。

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

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

在此之后,您将处理HEADING,然后是第一个SUBHEADING,然后是第二个SUBHEADING,然后是每个子块。对于包含块注释的子块,您可能会根据块缺少关键字而知道任何子块是注释,因此不需要处理子块。

答案 2 :(得分:1)

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