2014-11-05 20 views
2

我有一個看起來像標記/降格語言的語法。我們用它來製作我們的教科書。如何在ANTLR語法中捕獲任何東西?

它是這樣的:

 

    [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

我的問題是:我怎麼能寫一個語法像這樣的語言,我在其中裏面有標籤和任何內容?有任何想法嗎?

提前致謝!

回答

0

我不確定antlr,所以我發佈這個答案,可能會幫助你的正則表達式的想法。

你可以使用這樣的正則表達式:

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

Working demo

enter image description here

匹配信息

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