首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >雷克星,重叠规则,但想要更短的匹配

雷克星,重叠规则,但想要更短的匹配
EN

Stack Overflow用户
提问于 2014-05-22 17:26:36
回答 1查看 816关注 0票数 0

我想读取一个输入流,并将输入划分为两种类型: PATTERN & WORD_WEIGHT,定义如下。

问题产生于这样一个事实:为一个WORD_WEIGHT定义的所有字符对于一个模式也是有效的。当我们有多个没有空格的WORD_WEIGHTs时,lexer将匹配模式,而不是交付多个WORD_WEIGHTs。

我需要能够处理以下情况并获得指定的结果:

  • 20 => WORD_WEIGHT
  • cat =>模式
  • 狗=>模式

这个案子这就是问题所在。它匹配模式,因为雷克萨斯将选择更长的2种可能性。注:它们之间没有空隙。

  • 20 => WORD_WEIGHT WORD_WEIGHT

还需要处理这种情况(这对可能的解决方案施加了一些限制)。请注意,括号可能与模式不匹配.

  • [cat =>模式]

下面是语法:

代码语言:javascript
复制
grammar Brackets;

fragment
DIGIT
    : ('0'..'9')
    ;

fragment
WORD_WEIGHT_VALUE           
    : ('-' | '+')? DIGIT+ ('.' DIGIT+)? 
    | ('-' | '+')? '.' DIGIT+
    ;

WORD_WEIGHT 
    : '[' WORD_WEIGHT_VALUE ']' 
    ;

PATTERN   
    : ~(' ' | '\t' | '\r' | '\n' )+  
    ;

WS 
    : (' ' | '\t' | '\r' | '\n' )+ -> Skip
    ;


start : (PATTERN | WORD_WEIGHT)* EOF;

问题是,什么是Lexer规则会给出预期的结果?

我希望有一个特性,一个特殊的指令,它可以为影响匹配过程的lexer规则指定。在规则匹配时,它将指示lexer停止匹配过程,并使用此匹配的令牌。

跟进-我们选择的解决方案:

将上面的WORD_WEIGHT替换为:

代码语言:javascript
复制
fragment
WORD_WEIGHT 
    : '[' WORD_WEIGHT_VALUE ']'
    ;

WORD_WEIGHTS
    : WORD_WEIGHT (INNER_WS? WORD_WEIGHT)*
    ;

fragment
INNER_WS
    : (' ' | '\t' )+
    ;

此外,语法规则是:

代码语言:javascript
复制
start : (PATTERN | WORD_WEIGHTS)* EOF;

现在,任何单词权重序列(不管是分隔的还是不分隔的)都将是WORD_WEIGHTS令牌的值。这恰好与我们的用法相匹配--我们的语法(不在上面的片段中)总是将单词权重定义为“一个或多个”。现在,多重性由lexer而不是解析器“捕获”。如果/当我们需要单独处理每个单词的权重时,我们可以在应用程序中拆分值(解析树侦听器)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-22 18:57:43

您可以按以下方式实现WORD_WEIGHT

代码语言:javascript
复制
WORD_WEIGHT
  : '[' WORD_WEIGHT_VALUE ']'
    PATTERN?
  ;

然后,在您的lexer中,您可以重写emit方法来更正lexer的位置,以删除添加到WORD_WEIGHT令牌末尾的PATTERN (如果有的话)。您可以在ANTLRWorks 2中看到这方面的示例:

修改需要以下步骤。

  1. 重写LexerATNSimulator以添加resetAcceptPosition方法。
  2. 在lexer类的构造函数中将_interp字段设置为自定义LexerATNSimulator的实例。
  3. 为您的令牌计算所需的结束位置,并调用resetAcceptPosition。对于固定宽度的令牌,如您在ST4示例中看到的那样,计算只是出现在令牌开头的固定运算符或关键字的长度。对于您的情况,您需要调用getText()并检查结果,以确定WORD_WEIGHT令牌的正确长度。由于WORD_WEIGHT_VALUE规则不能与]匹配,最简单的分析可能是在getText()结果中找到第一个]字符的索引( WORD_WEIGHT的语法确保字符始终存在)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23813487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档