1

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

1 回答 1

0

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

因此,制作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 模棱两可的),我的也接受单个字符值。

高温高压


1 ANTLR 中解析器规则和词法分析器规则之间的实际区别?

2 ANTLR中的“片段”是什么意思?

于 2012-08-08T21:20:31.703 回答