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

如何解析antlr4中的可选岛文本

宦飞
2023-03-14

作为我的小语言示例问题的延续,我想问一下如何解析下面的文本。这次只是想跳过尾巴规则,但它是一个岛,对我来说并不明显。最好的,不那么陈腐的方法

a : sss 
a : eeee:yyyy 
a :  
a : tttt:aaa

使用以下使用词法模式的语法:

lexer grammar SimpleL;    

fragment WS : [ \t\r\n]+;

SEMI : ':' -> pushMode(TMODE);
HEAD : 'a' ;
WS_DEFAULT: WS -> skip;

mode TMODE;

TAIL   :   [a-z:]+  -> popMode;
WS_TMODE : WS -> skip;
parser grammar Simple;  

options {
  tokenVocab = SimpleL;
}

prog : entry+ EOF;

entry : head semi tail;

semi : SEMI;    
tail : TAIL;    
head : HEAD;
(prog (entry (head a) (semi :) (tail sss)) 
      (entry (head a) (semi :) (tail eeee:yyyy)) 
      (entry (head a) (semi :) (tail )
      (entry (head a) (semi :) (tail tttt:aaa)
 ) <EOF>)
 entry : (head semi head semi tail | head semi tail);
 entry : (head semi tail?);

使用不同顺序的lexer规则。也尝试了更多的词汇命令,但没有成功。

共有1个答案

王俊楚
2023-03-14

似乎您确实想用换行符作为转义字符,比如“;”在大多数编程语言中。因此,换行符必须成为一种规则,而不仅仅是空白字符。

 类似资料:
  • 我一直在尝试使用antlr4为我需要的一个小型模板系统创建一个解析器。模板就像您看到的一些函数一样,总是以相同数量的{{和}}开始,并且在其中定义了将被pasd和执行的函数,并且应该用该函数结果替换整个内容。 问题是我想把函数之外的所有其他文本都放在一边,只解析我定义的内容。此时字符串不匹配或只保留其他文本。我想跳过或忽略除定义的函数之外的所有全文。 最终目标是用函数的结果替换整个{{...}}部

  • 我只剩下一个问题:我不知道如何处理RegEx文本的转角情况,如下所示: 被解释为RegEx文本,因为lexer规则始终处于活动状态。 我想要的是合并这个逻辑(C#代码。我需要JavaScript,但我不知道如何修改它):

  • 我想与您分享一个我必须在ANTLR4中实现的岛屿解决方案。 > 语言的结构。我必须为其编写语法的语言是从PL/SQL派生出来的,带有一些附加的构造。我在这里不做更多的详细说明,因为这与主题无关。 该语言定义了一个特殊的命令,其结构如下: 。 我的解决办法是: 任何反馈都是非常欢迎的!问候,沃尔夫冈·哈默

  • 问题内容: 我有一堂课,看起来像这样: 在这里,我不得不写a,因为如果我想在使用Lombok时返回Optional,则必须声明为。这将生成一个接受的生成器方法! 还有其他方法可以使用lombok 吗? 问题答案: 答案是否定的,可能永远也不会。 您可能做错了:-) 并不是预防的替代品,也不是预防的奇特方法。这表示该问题无法回答,例如:空人员列表的平均年龄是多少。 绝对不应传递,而应尽快由调用代码取

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

  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?