使用ANTLR,如何在不使用语言特定语义谓词的情况下处理特定重复?

时间:2012-08-08 18:31:22

标签: antlr semantics predicates

我正在尝试使用ANTLR对mqsi命令进行建模,并遇到了以下问题。 mqsicreateconfigurableservice的文档对queuePrefix说: “前缀可以包含在WebSphere®MQ队列名称中有效的任何字符,但不得超过八个字符,并且不得以句点(。)开头或结尾。例如,SET.1有效,但是。 SET1和SET1。无效。多个可配置服务可以使用相同的队列前缀。“

我使用了以下内容作为权宜之计,但这种技术意味着我必须至少有两个字符的名称,这似乎是一个非常浪费和不可扩展的解决方案。有更好的方法吗?

请参阅下面的'queuePrefixValue'...

谢谢:o)

parser grammar mqsicreateconfigurableservice;
mqsicreateconfigurableservice
:   'mqsicreateconfigurableservice' ' '+ params
;
params  :   (broker ' '+ switches+)
;
broker  :   validChar+
;
switches
:   AggregationConfigurableService
;
AggregationConfigurableService
:    (objectName ' '+ AggregationNameValuePropertyPair)
;

objectName
:   (' '+ '-o' ' '+ validChar+)
;

AggregationNameValuePropertyPair
:   (' '+ '-n' ' '+ 'queuePrefix' ' '+ '-v' ' '+ queuePrefixValue)?
    (' '+ '-n' ' '+ 'timeoutSeconds' ' '+ '-v' ' '+  timeoutSecondsValue)?
;

// I'm not satisfied with this rule as it means at least two digits are mandatory
//Couldn't see how to use regex or semantic predicates which appear to offer a solution
queuePrefixValue
:   validChar (validChar | '.')? (validChar | '.')? (validChar | '.')? (validChar | '.')? (validChar | '.')? (validChar | '.')? validChar
;
timeoutSecondsValue //a positive integer
:   ('0'..'9')+
;

//This char list is just a temporary subset which eventually needs to reflect all the WebSphere acceptable characters, apart from the dot '.'
validChar
:   (('a'..'z')|('A'..'Z')|('0'..'9'))
;

1 个答案:

答案 0 :(得分:0)

您正在使用解析器规则,而应使用词法分析器规则而不是 1 . dot 元字符)和..范围元字符)在解析器规则中的行为与在词法分析器中的行为不同规则。在解析器规则中,.匹配任何标记(在lexer规则中它们匹配任何字符),..将匹配标记范围, 字符范围因为你期望它们匹配!

所以,让queuePrefixValue成为词法分析器规则(让它以大写字母开头:QueuePrefixValue),并在适当的地方使用fragment规则 2 。您的QueuePrefixValue可能如下所示:

QueuePrefixValue
 : StartEndCH ((((((CH? CH)? CH)? CH)? CH)? CH)? StartEndCH)?
 ;

fragment StartEndCH
 : 'a'..'z'
 | 'A'..'Z'
 | '0'..'9'
 ;

fragment CH
 : '.'
 | StartEndCH
 ;

所以,或多或少会回答你的问题:不,没有方法来限制令牌具有一定数量的字符,而不是特定于语言谓语。请注意,我上面的建议不含糊不清(您的QueuePrefixValue 不明确),我的也接受单个字符值。

HTH


1 Practical difference between parser rules and lexer rules in ANTLR?

2 What does "fragment" mean in ANTLR?