我正在尝试使用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'))
;
答案 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?