我有一個看起來像標記/降格語言的語法。我們用它來製作我們的教科書。如何在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
我的問題是:我怎麼能寫一個語法像這樣的語言,我在其中裏面有標籤和任何內容?有任何想法嗎?
提前致謝!