簡體   English   中英

如何捕獲ANTLR語法中的任何內容?

[英]How to capture anything in an ANTLR grammar?

我有一個看起來像標記/標記語言的語法。 我們用它來制作我們的教科書。

就像這樣:

[chapter Introduction]

    [section First program]

    Java is pretty cool, **we love it**, let's learn.

    Use the ::javacc:: to compile stuff.

    [title C# is also cool]

    bla bla 

    [code]

    some java code in here

    [/code]

我們有這種[tag xxx]content[/tag]標記語言。 我為此編寫了語法,但並非在所有情況下都適用。 我的主要疑問是如何捕獲[code]甚至[title]內部的內容,可以是任何內容。

為了捕獲[section blabla] ,我嘗試了以下操作:

secao      : '[section ' secao_nome ']';
    secao_nome : (~']'+?);

我試圖(~']'+?)來捕獲除結束標記之外的所有內容。 那是我的主要思想:編寫許多這樣的正則表達式,為我擁有的每個標記編寫一個正則表達式,並使它們忽略“關閉標記”。 例如,我嘗試執行(~'::'+?)來捕獲斜體的內容(以::結束)。

我還嘗試對內部內容使用通用令牌。 但是,我需要忽略::**和所有實際取決於上下文的符號。 因此,我的表達式RAW : (~[\\n\\[\\]'**''::''__''%%'' '0-9\\"] | ':')+;不起作用。

您可以在這里看到我的完整語法。 對不起,名字是葡萄牙語:

grammar Tubaina;

    @header {
        package br.com.caelum.tubaina.antlr;
    }

    afc                 : capitulo conteudos+;

    capitulo            : '[chapter ' capitulo_nome ']';
    capitulo_nome       : (~']'+?)*;

    conteudos           : enter* conteudo+ enter*;
    conteudo            : (secao | texto | subsecao | label | box | codigo | lista | imagem | exercicios | index | tabela | quote | todo | note);

    secao               : '[section ' secao_nome ']';
    secao_nome          : (~'['+?);

    quote               : '[quote ' quote_texto '--' quote_autor ']';
    quote_texto         : (~'--'+?);
    quote_autor         : (~']'+?);

    tabela              : '[table "' tabela_nome '"]' tabela_linhas+;
    tabela_nome         : (~'"'+?);
    tabela_linhas       : '[row]' tabela_colunas+ '[/row]';
    tabela_colunas      : '[col]' tabela_conteudo '[/col]';
    tabela_conteudo     : conteudo;

    index               : '[index ' index_nome ']';
    index_nome          : (~']'+?);

    exercicios          : '[exercise]' questoes '[/exercise]';
    questoes            : (enter* questao_def enter*)+;
    questao_def         : '[question]' enter* questao resposta_def? enter* '[/question]';
    questao             : (conteudo | enter)+; 
    resposta_def        : enter* '[answer]' resposta '[/answer]';
    resposta            : (texto | enter)+; 

    imagem                  : '[img ' espaco* imagem_path espaco* imagem_tamanho_def? espaco* (imagem_comentario_def? | ']');
    imagem_path             : (~' '+?);
    imagem_tamanho_def      : 'w=' imagem_tamanho '%';
    imagem_tamanho          : NUMERO;
    imagem_comentario_def   : '"' imagem_comentario '"]';
    imagem_comentario       : (~'"'+?);

    lista               : lista_numerada | lista_nao_numerada;
    lista_numerada      : '[list ' lista_tipo ']' item* '[/list]';
    lista_tipo          : 'number' | 'roman' | 'letter';
    lista_nao_numerada  : '[list]' item* '[/list]';
    item                : enter* '*' texto* enter*;

    todo                : todo_comando todo_comentario ']';
    todo_comando        : '[todo ' | '[TODO ';
    todo_comentario     : (~']'+?);

    note                : '[note]' note_conteudo+ '[/note]';
    note_conteudo       : (enter* texto enter*);

    box                 : '[box ' box_titulo ']' box_conteudo+ '[/box]';
    box_conteudo        : (enter* conteudos+ enter*);
    box_titulo          :  (~']'+?);

    subsecao            : '[title ' subsecao_nome ']';
    subsecao_nome       : (~']'+?);

    label               : '[label ' label_nome ']';
    label_nome          : (~']'+?);

    codigo                  : codigo_com_linguagem | codigo_sem_linguagem | codigo_do_arquivo;
    codigo_do_arquivo       : '[code ' linguagem 'filename=' codigo_arquivo_path '[/code]';
    codigo_arquivo_path     : (~' '+?);
    codigo_raw              : (~'[/code]'+?);
    linguagem               : (~' '+?);
    codigo_sem_linguagem    : '[code]' codigo_raw '[/code]';
    codigo_com_linguagem    : '[code ' linguagem codigo_fechado codigo_raw '[/code]';
    codigo_fechado          : ' #]' | ']';

    texto               : paragrafo | negrito | italico | underline | inline;
    paragrafo           : linha enter?;
    linha               : (~'\n'+?);
    negrito             : '**' linha '**';
    italico             : '::' linha '::';
    underline           : '__' linha '__';
    inline              : '%%' linha '%%';

    enter                       : N | TAB;
    espaco                      : ESPACO;

    N                   : ['\n'];
    TAB                 : '\t';
    ESPACO : ' ';
    NUMERO : [0-9]+;

    WS                  : (' ' | '\t') -> skip;

另外,我對通用正則表達式的嘗試在這里: https : //github.com/mauricioaniche/tubaina-antlr-grammar/blob/f381ad0e3d1bd458922165c7166c7f1c55cea6c2/src/br/com/caelum/tubaina/antlr/Tubaina.g4

我的問題是:如何為這樣的語言編寫語法,在其中我有標記和任何內容? 有任何想法嗎?

提前致謝!

我不確定antlr,所以我發布了這個答案,可能會對您使用正則表達式有所幫助。

您可以使用以下正則表達式:

\[code\]([\s\S]+)\[/code\]|\[title (.+)\]

工作演示

在此處輸入圖片說明

比賽信息

MATCH 1
2.  [165-180]   `C# is also cool`
MATCH 2
1.  [207-241]   `

    some java code in here

    `

我將兩個正則表達式都放在一個使用OR的復合表達式中,以向您展示這個想法。 如果您能夠使用2個正則表達式,則可以使用以下內容:

\[code\]([\s\S]+)\[/code\]   <-- to capture the [code]XX[/code] content
\[title (.+)\]               <-- to capture the [title XX] content

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM