【问题标题】:How to capture anything in an ANTLR grammar?如何捕获 ANTLR 语法中的任何内容?
【发布时间】:2015-01-02 07:48:36
【问题描述】:

我有一个看起来像标记/降价语言的语法。我们用它来制作我们的教科书。

类似于:

【章节介绍】 【第一节节目】 Java 非常酷,**我们喜欢它**,让我们学习。 使用 ::javacc:: 来编译东西。 [标题C#也很酷] 呜呜呜 [代码] 这里有一些java代码 [/代码]

我们有这种[tag xxx]content[/tag] 标记语言。我为此编写了语法,但它不适用于所有情况。我的主要疑问是如何捕获[code] 甚至[title] 内部的内容,可以是任何内容。

为了捕获[section blabla],我尝试了以下方法:

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

我尝试(~']'+?) 捕获除结束标记之外的所有内容。那是我的主要想法:编写许多这样的正则表达式,一个用于我拥有的每个标签,并让它们忽略“关闭标签”。例如,我尝试使用(~'::'+?) 来捕获斜体的内容(以:: 结尾)。

我还尝试为内部内容使用通用标记。但是,我需要忽略 ::** 以及所有实际含义取决于上下文的符号。所以,我的表达式RAW : (~[\n\[\]'**''::''__''%%'' '0-9\"] | ':')+; 不起作用。

您可以在此处查看我的完整语法。对不起,名字是葡萄牙语:

语法图拜纳; @标题{ 包 br.com.caelum.tubaina.antlr; } afc : capitulo conteudos+; capitulo:'[章节'capitulo_nome']'; capitulo_nome : (~']'+?)*; conteudos : 输入* 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_texto'--'quote_auto']'; quote_texto : (~'--'+?); quote_auto : (~']'+?); tabela : '[table "' tabela_nome '"]' tabela_linhas+; tabela_nome : (~'"'+?); tabela_linhas : '[行]' tabela_colunas+ '[/row]'; tabela_colunas : '[col]' tabela_conteudo '[/col]'; tabela_conteudo : conteudo; 索引:'[索引'index_nome']'; index_nome : (~']'+?); 练习 : '[练习]' 任务 '[/exercise]'; questoes : (enter* questao_def enter*)+; questao_def : '[question]' 输入* questao resposta_def?输入*'[/问题]'; questao : (conteudo | enter)+; resposta_def : 输入* '[answer]' resposta '[/answer]'; 回复:(文本|输入)+; imagem : '[img' espaco* imagem_path espaco* imagem_tamanho_def? espaco* (imagem_commentario_def?| ']'); imagem_path : (~' '+?); imagem_tamanho_def : 'w=' imagem_tamanho '%'; imagem_tamanho:数字; imagem_commentario_def : '"' imagem_commentario '"]'; imagem_commentario : (~'"'+?); lista : lista_numerada | lista_nao_numerada; lista_numerada : '[list ' lista_tipo ']' 项目* '[/list]'; lista_tipo : '数字' | '罗马' | '信件'; lista_nao_numerada : '[list]' 项目* '[/list]'; item : enter* '*' texto* enter*; todo : todo_comando todo_commentario ']'; todo_comando : '[待办事项 ' | '[去做 '; todo_commentario : (~']'+?); 注意:'[note]' note_conteudo+ '[/note]'; note_conteudo : (enter* texto enter*); box : '[box ' box_titulo ']' box_conteudo+ '[/box]'; box_conteudo : (enter* conteudos+ enter*); box_titulo : (~']'+?); subsecao : '[标题' subsecao_nome ']'; subsecao_nome : (~']'+?); 标签:'[标签'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]'+?); 语言 : (~' '+?); codigo_sem_linguagem : '[code]' codigo_raw '[/code]'; codigo_com_linguagem : '[code' linguagem codigo_fechado codigo_raw '[/code]'; codigo_fechado : '#]' | ']'; 文本:paragrafo |黑人 |斜体 |下划线 |排队; paragrafo : linha 进入? linha : (~'\n'+?); negrito : '**' 林哈 '**'; 斜体 : '::' linha '::'; 下划线:'__' linha '__'; 内联:'%%' linha '%%'; 输入:N |标签; 埃斯帕科:埃斯帕科; N : ['\n']; 制表符:'\t'; ESPACO : ' '; 数字:[0-9]+; WS : (' ' | '\t') -> 跳过;

另外,我在这里尝试使用通用正则表达式:https://github.com/mauricioaniche/tubaina-antlr-grammar/blob/f381ad0e3d1bd458922165c7166c7f1c55cea6c2/src/br/com/caelum/tubaina/antlr/Tubaina.g4

我的问题是:我怎样才能为这样的语言编写语法,其中我有标签和其中的任何内容?有什么想法吗?

提前致谢!

【问题讨论】:

    标签: regex parsing antlr4


    【解决方案1】:

    我不确定 antlr,所以我发布这个答案可能会帮助您了解正则表达式的想法。

    你可以使用这样的正则表达式:

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

    Working demo

    比赛信息

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多