我想读取一个输入流,并将输入划分为两种类型: PATTERN & WORD_WEIGHT,定义如下。
问题产生于这样一个事实:为一个WORD_WEIGHT定义的所有字符对于一个模式也是有效的。当我们有多个没有空格的WORD_WEIGHTs时,lexer将匹配模式,而不是交付多个WORD_WEIGHTs。
我需要能够处理以下情况并获得指定的结果:
这个案子这就是问题所在。它匹配模式,因为雷克萨斯将选择更长的2种可能性。注:它们之间没有空隙。
还需要处理这种情况(这对可能的解决方案施加了一些限制)。请注意,括号可能与模式不匹配.
下面是语法:
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替换为:
fragment
WORD_WEIGHT
: '[' WORD_WEIGHT_VALUE ']'
;
WORD_WEIGHTS
: WORD_WEIGHT (INNER_WS? WORD_WEIGHT)*
;
fragment
INNER_WS
: (' ' | '\t' )+
;此外,语法规则是:
start : (PATTERN | WORD_WEIGHTS)* EOF;现在,任何单词权重序列(不管是分隔的还是不分隔的)都将是WORD_WEIGHTS令牌的值。这恰好与我们的用法相匹配--我们的语法(不在上面的片段中)总是将单词权重定义为“一个或多个”。现在,多重性由lexer而不是解析器“捕获”。如果/当我们需要单独处理每个单词的权重时,我们可以在应用程序中拆分值(解析树侦听器)。
发布于 2014-05-22 18:57:43
您可以按以下方式实现WORD_WEIGHT:
WORD_WEIGHT
: '[' WORD_WEIGHT_VALUE ']'
PATTERN?
;然后,在您的lexer中,您可以重写emit方法来更正lexer的位置,以删除添加到WORD_WEIGHT令牌末尾的PATTERN (如果有的话)。您可以在ANTLRWorks 2中看到这方面的示例:
LBRACE 4中的StringTemplate令牌是由此代码修改。DELIMITERS 4中的StringTemplate令牌是由此代码修改。修改需要以下步骤。
LexerATNSimulator以添加resetAcceptPosition方法。_interp字段设置为自定义LexerATNSimulator的实例。resetAcceptPosition。对于固定宽度的令牌,如您在ST4示例中看到的那样,计算只是出现在令牌开头的固定运算符或关键字的长度。对于您的情况,您需要调用getText()并检查结果,以确定WORD_WEIGHT令牌的正确长度。由于WORD_WEIGHT_VALUE规则不能与]匹配,最简单的分析可能是在getText()结果中找到第一个]字符的索引( WORD_WEIGHT的语法确保字符始终存在)。https://stackoverflow.com/questions/23813487
复制相似问题