当前位置: 首页 > 知识库问答 >
问题:

如何使用antlr4跳过不可解析的文本?

周翼
2023-03-14

我一直在尝试使用antlr4为我需要的一个小型模板系统创建一个解析器。模板就像您看到的一些函数一样,总是以相同数量的{{和}}开始,并且在其中定义了将被pasd和执行的函数,并且应该用该函数结果替换整个内容。

问题是我想把函数之外的所有其他文本都放在一边,只解析我定义的内容。此时字符串不匹配或只保留其他文本。我想跳过或忽略除定义的函数之外的所有全文。

最终目标是用函数的结果替换整个{{...}}部分。

有没有办法跳过所有其他文本?

这是示例文本:

allkinds of text $#@ {{getMetaSelf option1}} blabla bla {{getEnv test test}} now repeat something: {{repeatPerInstance test ','}} 
this will get repeated. sub functions are possible here now: {{getMetaInstance option1}} blabla {{endrepeat}} more text.

这就是我目前所做的:

parse: EOF | (functions | STRING)* ;

functions : '{{' func STRING*
          ;

func : getterFunctions
     | 'repeatPerInstance ' KEYWORD ( ' ' delimiter )? '}}' ( '{{' ( getterFunctions | repeatSubFunctions ) )*  '{{endrepeat}}'
     ;

getterFunctions : 'getEnv ' KEYWORD ' ' KEYWORD '}}'
                | 'getMetaSelf ' metaoptions '}}'
                ;

repeatSubFunctions : 'getEnvRole' KEYWORD '}}'
                   | 'getMetaInstance' metaoptions '}}'
                   ;


metaoptions : 'option1'
            | 'option2'
            | 'option3'
            | 'option4'
            ;

delimiter : '\'' ',' '\'' ;

STRING : . +? ;

KEYWORD : [0-9A-Za-z\-\_]+ ;
WS  : [ \t\n\r]+ -> skip ;

共有2个答案

轩辕乐邦
2023-03-14

顺便说一句。:

以下行似乎很奇怪,因为它在函数后接受字符串,这可能不是预期的:

函数:“{{”func字符串*;

我还会以这种方式对函数进行建模(未测试),它将{{}}分组:

parse: (function | STRING)* EOF ;


function : '{{' 
            functionBody
            '}}'
          ;

functionBody 
     : getterFunctions
     | 'repeatPerInstance ' KEYWORD ( ' ' delimiter )? '}}' ( '{{' ( getterFunctions | repeatSubFunctions ) '}}')*  '{{endrepeat'
     ;

getterFunctions : 'getEnv ' KEYWORD ' ' KEYWORD 
                | 'getMetaSelf ' metaoptions 
                ;

repeatSubFunctions : 'getEnvRole' KEYWORD 
                   | 'getMetaInstance' metaoptions 
                   ;
徐星阑
2023-03-14

您可以为此使用多模式lexer。由于文件以自由格式文本开头,默认模式将是包含您的文本规则的模式

lexer grammar MyLexer;

TEXT
  : ( ~'{'
    | '{' {_input.LA(1) != '{'}?
    )+
  ;

OPEN_TAG
  : '{{' -> pushMode(InTag)
  ;

mode InTag;

  END_TAG
    : '}}' -> popMode
    ;

  // other rules for tokens inside of {{ ... }} go here
 类似资料:
  • 作为我的小语言示例问题的延续,我想问一下如何解析下面的文本。这次只是想跳过尾巴规则,但它是一个岛,对我来说并不明显。最好的,不那么陈腐的方法? 使用以下使用词法模式的语法: 使用不同顺序的lexer规则。也尝试了更多的词汇命令,但没有成功。

  • 亲爱的Antlr4社区, 解析似乎很顺利: 但是,我得到以下错误消息: 错误是: [1]交换量子精确和正态分布的定义。但是交换在第一个输入中引入了一个错误: 因为在这种情况下,'6'只被视为一个正态分布,而不是一个全精确值。 [2]尝试为Quanteact(数量的花括号)创建一个上下文,这样lexer只在这个有限的上下文中提供Quanteact符号。但是我没有为此找到ANTLR4原语。 所以似乎什

  • 在我刚刚编写的一个测试解析器中,我遇到了一个奇怪的问题,我不太明白。 将其简化为显示问题的最小示例,让我们从以下语法开始: 这是语法的变化: 突然间,相同的测试输入被错误地分解成两个statement_list,每个statement_list都继续到一个带有“missing”;“警告,第一个返回“z=”的不完整的assignment_statement,第二个返回“x+”的不完整的assignm

  • 问题内容: 所以,我有一个像 所以,我有一个条件说如果ts =“ 2”然后做某事…现在的问题是,当它找到ts =“ 1”时,它仍然扫描标签 ,然后到达 当条件与解析中断不匹配并直接寻找下一个事务标记时,是否有办法? 问题答案: SAX解析器必须扫描所有子树(例如“ ”)以知道下一个元素的起始位置。无法解决它,这也是为什么您不能为单个XML文档并行化XML Parser的原因。 在您的情况下,我可以

  • 我正在尝试使用antlr4版本4.4和python2运行时。语法来自antlr4书,第6页,文件:Hello. g4: 我用命令生成lexer和parser 然后生成文件HelloLexer.py、HelloParser.py和HelloListener.py。我做了一个主程序test.py来测试生成的python解析器: 一切似乎都正常,只是我无法打印解析树。 我还没弄明白问题出在哪里。

  • 我所开发的ANTR4语法。在解析字符串期间 时间;25 10 * * *;' faccalc_minus1_cron.out.'yyyyMMdd。嗯;美国/New_York 我有以下错误 表达式中的字符无效!表达式:;'无效字符:;'无关输入“;”应为{“”,整数,“-”,“/”,“,”},缺少“;”“\uu”处的时区格式不正确:faccalc\u minus1 我不理解为什么,因为正则表达式规则