代码之家  ›  专栏  ›  技术社区  ›  polara

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

  •  0
  • polara  · 技术社区  · 16 年前

    我正试图编写一个应用程序,从专有的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 }
      }
    }
    

    我要做的是提取副标题栏下的内容。在副标题2的情况下,我还将用分号分隔每个标记。我已经相当成功地计算了括号并跟踪了我目前的副标题。我遇到的主要问题涉及处理代码注释。

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

    解决这一问题的最佳方法是什么?我查看了另一篇文章(antlr、doxygen等)中讨论的一些编译器库,但对于解决这个特定的解析问题来说,它们似乎是多余的。

    3 回复  |  直到 16 年前
        1
  •  1
  •   John Fisher    16 年前

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

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

    • 从字符串中提取每个顶级块,使用regex标记分别标识块关键字和内容。
    • 如果发现一个块,
      • 根据关键字做出决定
      • 将内容递归传递到此进程。

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

        2
  •  5
  •   FastAl    16 年前

    我建议编写一个标记器和解析器;这将给您更多的灵活性。记号赋予器基本上对源代码进行简单的文本分解,并将其放入更可用的数据结构中;解析器会找出如何处理它,通常利用递归。

    谷歌术语:标记器、解析器、编译器设计、语法

    数学表达式计算器: http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx (你可以举一个这样的例子,把它分解成你想要的东西)

    有关分析的详细信息: http://www.codeproject.com/KB/recipes/TinyPG.aspx

    你不必去接近那些文章,但是,你要先研究一下这篇文章。

        3
  •  1
  •   devio    16 年前

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