如何构造PAR

2024-09-30 08:15:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在构建一个简单的解析器,但是我很难理解总体设计。最佳实践是什么?在

解析器获取一个简单的文本文件并将其构造成一个HTML文件,这将大量使用嵌套列表,并为每个列表项添加一个索引和一个ID。在

输入(为了清晰起见添加了缩进)。在

A. First section with random name
  Article 1
  Spam and eggs and some more
  Article 2
    1. The first member
    2. The second member
    3. The final member
B. Second section called whatever
  Article 3
  This one has no members but it does contain subs
    a. item 1
    b. item 2
  Article 4
    1. A member
    2. A member with subs
      a. sub 1 here
      b. sub 2 here
      c. final sub
C. Another section
etc

我有正则表达式来查找不同的列表项和行号(现在我使用的是lexer,但这可能会有点过头了,对吧?)在

如前所述,我需要生成嵌套的HTML列表,每个列表项都有一个ID。根据您的经验,您将如何表示文档的结构?在

作为一系列元组或字典,每个项目都有(id,行号):

^{pr2}$

或者作为嵌套元组,其中每个标记都有(类型、id、行号):

(('SECTION','A',1 , 
    ('ARTICLE','1',2),
    ('ARTICLE','2',4 ,
        ('MEMBER','2-1',5),
        ('MEMBER','2-2',6),
        ('MEMBER','2-3',7)
    )
 )

现在我倾向于第二种选择。第一个比较容易构建和迭代,但是只能通过查看周围的行号来推断层次结构。在

你是这样做的,还是完全不同的方式?我不是要你写我的解析器或正则表达式,我只是在寻找关于最佳实践的合理建议。在

我用HTML添加了所需的输出。索引:

<div id="index">
    <ol class="indexlist sections">
        <li><a href="#listref_A">First section with random name</a><br>
            Article 1 - 2</li>
        <li><a href="#listref_B">Second section called whatever</a><br>
            Artikel 3 - 4</li>
        <li><a href="#listref_C">Another section</a><br>
            Article 5</li>
    </ol>

内容:

<div id="content">
    <ol class="sections">
        <li id="listref_D"><h2></h2>
        <ol class="articles">
            <li id="listref_8">Article 8
                <ol class="members">
                    <li id="listref_8-1">Member 1.</li>
                    <li id="listref_8-2">Member 2</li>
                    <li id="listref_8-3">Member 3</li>
                    <li id="listref_8-4">Member 4.</li>
                </ol>
            </li>
        </ol>
    </li>
    <li id="listref_E">Section E
        <ol class="articles">
            <li id="listref_9">Article 9
                <ol class="members">
                    <li id="listref_9-1">Member 1 has subs:
                        <ol class="subs">
                            <li id="listref_9-1-a">sub a;</li>
                            <li id="listref_9-1-b">sub b;</li>
                            <li id="listref_9-1-c">sub c.</li>
                        </ol>
                    </li>
                    <li id="lijstref_9-2">Member 2, refers to <a href="#listref_8-2">article 8 sub 2</a>.</li>
                </ol>

Tags: id解析器列表htmlarticlesectionliclass
1条回答
网友
1楼 · 发布于 2024-09-30 08:15:52

尝试使用ANTLR Lexer/Parser组合。您只需要正则表达式就可以生成lexer/basic解析器组合。它使用了一种类似于BNF语法的策略,并且您可以定义操作,以便很容易地打印到控制台或文件中。默认情况下,它输出Java,但是antlr4也输出到C。antlr3可以输出到其他几种语言,比如Ruby。在

要生成lexer的一部分,您可以做如下操作

 // Define Tokens
 WS : [ \t\r\n] ~> skip;
 DOT : '.';
 ARTICLE : 'Article';

 fragment DIGIT : [0-9];
 fragment ALPHA : [a-zA-Z];

 AlphaString : ALPHA+;
 Number : DIGIT+;
 AlphaNumericString : (AlphaString | Number)+;

 // Define Lexer and Parser Grammars
 SectionTitle : AlphaString;
 SectionHeader : SectionTitle DOT AlphaNumericString;

 ArticleHeader : ARTICLE Number;

 MemberTitle : Number;
 MemberHeader : MemberTitle DOT AlphaNumericString;

 submember : /*Code to define submember*/;     

 member : MemberHeader submember+;

 article : ArticleHeader (member | AlphaNumericString)+;

 section : SectionHeader
           (article | AlphaNumericString)+;

显然,这不是一个全面的语法,但它显示了基础。一个好的引用是ANTLR 4 Documentation Wiki和{a2}。它们向您展示了如何执行这些语法以及如何在其中嵌入动作。他们都是小项目或大项目的好向导。后者的第2章和第3章以简单的方式展示了您需要的基本知识,并提供了一些好的示例。在

相关问题 更多 >

    热门问题