我有一个简单的语法来解析verilog连接:
scalar = (Optional(Word(nums + "_") + "'" + oneOf("d h b")) + Word(nums + "_")).setName("Scalar")
operator = oneOf("+ - * /").setName("Operator")
identifier = Word(alphas, alphanums+"_").setName("Identifier")
expr = (scalar | identifier) + ZeroOrMore(operator + (scalar | identifier))
range = expr + ":" + expr
index = "[" + range + "]"
single_netref = (identifier + Optional(index)).setName("Single Net Reference")
single_netref.setDebug()
lbracket = Literal("{").setName("Left Bracket").setDebug()
rbracket = Literal("}").setName("Left Bracket").setDebug()
concat_netref = (lbracket + single_netref + ZeroOrMore( Suppress( "," ) + single_netref ) + rbracket).setName("Net Concatination Reference")
concat_netref.setDebug()
如果我使用parseString方法解析字符串“{LegacyStatus3gPreStageQ1,LegacyData3gPreStageQ1}”,它解析得很好;但是,我想匹配一个网络引用的串联或一个单独的网络引用。为此,我尝试了:
^{pr2}$但是,这(以及使用Or()总是跳过最后一个rbracket,但表示它成功地匹配了netref。这是我的调试输出:
Match Net Reference at loc 0(1,1)
Match Left Bracket at loc 0(1,1)
Matched Left Bracket -> ['{']
Match Single Net Reference at loc 1(1,2)
Matched Single Net Reference -> ['LegacyStatus3gPreStageQ1']
Match Single Net Reference at loc 28(1,29)
Matched Single Net Reference -> ['LegacyData3gPreStageQ1']
Matched Net Reference -> ['{', 'LegacyStatus3gPreStageQ1', 'LegacyData3gPreStageQ1']
为什么添加MatchFirst()元素会导致rbracket丢失?在
MatchFirst应该传递一个表达式列表。在
改变
到
^{pr2}$相关问题 更多 >
编程相关推荐