Regex 如何捕获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] 我尝试了Regex 如何捕获ANTLR语法中的任何内容?,regex,parsing,antlr4,Regex,Parsing,Antlr4,我有一个语法,看起来像一个标记/标记语言。我们用它来制作教科书 有点像: [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
(~']'+?)
来捕获除了结束标记以外的所有内容。这就是我的主要想法:编写许多这样的正则表达式,每个标记对应一个正则表达式,让它们忽略“close标记”。例如,我尝试使用(~':'+?)
捕获斜体的内容(以:
结尾)
我还尝试为内部内容使用通用标记。但是,我需要忽略:
,***
,以及所有根据上下文实际有意义的符号。因此,我的表达式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;
语法图拜纳;
@标题{
包br.com.caelum.tubaina.antlr;
}
afc:Capitalulo conteudos+;
capitulo:“[章节“capitulo_nome”]”;
大写名称:(~']'+?)*;
conteudo:输入*conteudo+enter*;
上下文:(secao | texto | subsecao | label | box | codigo | lista | imagem | exercicios | index | tabela | quote | todo | note);
secao:“[secao_nome'部分]”;
分词:(~'['+?);
报价:'[quote'quote_texto'-'quote_autor'];
引用文本:(~'-'+?);
自动报价:(~']'+?);
tabela:“[表”'tabela_nome'”]'tabela_linhas+;
tabela_nome:(~'''+?);
tabela_linhas:“[row]”tabela_colunas+“[/row]”;
tabela_colunas:'[col]'tabela_conteudo'[/col]';
塔贝拉•乌孔杜多:孔杜多;
索引:'[index'index_nome']';
索引名称:(~']'+?);
练习:“[练习]”问题“[/练习]”;
问题:(输入*questao_def enter*)+;
提问:“[问题]”输入*questao resposta_def?输入*“[/question]”;
questao:(conteudo | enter)+;
resposta_def:输入*'[answer]'resposta'[/answer]';
resposta:(texto | enter)+;
图像M:“[img”espaco*图像M_路径espaco*图像M_tamanho_def?espaco*(图像M_comentario_def?)”;
图像路径:(~''+?);
imagem_tamanho_def:'w='imagem_tamanho'';
imagem_tamanho:数字;
imagem_comentario_def:“‘imagem_comentario’””;
图像元素:(~'“'+?);
lista:lista_numerada | lista_nao_numerada;
lista_numerada:“[list'lista_tipo']”项*“[/list]”;
lista|u tipo:“数字”|“罗马”|“字母”;
lista_nao_numerada:“[list]”项*“[/list]”;
项目:输入*'*'文本到*输入*;
todo:todo_comando todo_comentario'];
待办事项:待办事项;
todo_comentario:(~']'+?);
注:“[note]”注_conteudo+“[/note]”;
注:(输入*文本输入*);
方框:'[box'box_titulo']'box_conteudo+'[/box]';
框_conteudo:(输入*conteudos+输入*);
框体:(~']'+?);
水下作业:“[标题“水下作业”];
海底名称:(~']'+?);
标签:'[标签'标签名称'];
标签名称:(~']'+?);
codigo:codigo_com|u linguage | codigo_sem|u linguage | codigo_do|u arquivo;
codigo_do_arquivo:'[code'linguage'文件名='codigo_arquivo_路径'[/code]';
codigo_arquivo_路径:(~''+?);
原始代码:(~'[/code]'+?);
语言:(~''+?);
codigo_sem_language:'[code]'codigo_raw'[/code]';
codigo_com_language:“[code'linguage codigo_fechado codigo_raw'[/code]”;
codigo_fechado:'#]'|''];
texto:paragrafo | negrito | italic | underline | inline;
段落:林哈进入?;
林哈:(~'\n'+?);
内格里托:“**”林哈“**”;
斜体:“::”林哈:“:”;
下划线:''''linha'';
内联:“%%”linha“%”;
输入:N |选项卡;
espaco:espaco;
N:['\N'];
选项卡:'\t';
埃斯帕科:;
数字:[0-9]+;
WS:(''|'\t')->跳过;
此外,我对通用正则表达式的尝试如下:
我的问题是:我如何为这样一种语言编写语法,在这种语言中,我有标记和任何内容,有什么想法吗
提前感谢!我不确定antlr,所以我发布了这个答案,可能会帮助您理解regex的想法 您可以使用这样的正则表达式:
\[code\]([\s\S]+)\[/code\]|\[title (.+)\]
匹配信息
MATCH 1
2. [165-180] `C# is also cool`
MATCH 2
1. [207-241] `
some java code in here
`
我使用或将两个正则表达式放在一个复合表达式中,以向您展示这个想法。如果您能够使用2个正则表达式,那么您可以使用以下表达式:
secao : '[section ' secao_nome ']';
secao_nome : (~']'+?);
\[code\]([\s\S]+)\[/code\] <-- to capture the [code]XX[/code] content
\[title (.+)\] <-- to capture the [title XX] content
\[code\]([\s\s]+)\[/code\]