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 }" を解析すると、問題なく解析されます。ただし、ネット参照の連結または単一のネット参照のいずれかに一致させたいと考えています。これを行うために、私は試しました:
netref = MatchFirst(concat_netref, single_netref).setName("Net Reference").setDebug()
ただし、これ (および 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 が失われるのはなぜですか?