我是新手ruby
和treetop
。
我浏览了本教程并提出了以下规则。
grammar Sexp
rule body
commentPortString *(I am stuck here)*
end
rule interface
space? (intf / intfWithSize) space? ('\n' / end_of_file) <Interface>
end
rule commentPortString
space? '//' space portString space? ('\n' / end_of_file) <CommentPortString>
end
rule portString
'Port' space? '.' <PortString>
end
rule expression
space? '(' body ')' space? <Expression>
end
rule intf
(input / output) space wire:wireName space? ';' <Intf>
end
rule intfWithSize
(input / output) space? width:ifWidth space? wire:wireName space? ';' <IntfWithSize>
end
rule input
'input'
end
rule output
'output'
end
rule ifWidth
'[' space? msb:digits space? ':' space? lsb:digits ']' <IfWidth>
end
rule digits
[0-9]+
end
rule integer
('+' / '-')? [0-9]+ <IntegerLiteral>
end
rule float
('+' / '-')? [0-9]+ (('.' [0-9]+) / ('e' [0-9]+)) <FloatLiteral>
end
rule string
'"' ('\"' / !'"' .)* '"' <StringLiteral>
end
rule signalTypeString
'"' if_sig_name:signalType '"' <SignalTypeString>
end
rule signalType
[a-zA-Z] [a-zA-Z0-9_]* (receiveLiteral / transmitLiteral) <SignalType>
end
rule receiveLiteral
'.receive'
end
rule transmitLiteral
'.transmit'
end
rule identifier
[a-zA-Z\=\*] [a-zA-Z0-9_\=\*]* <Identifier>
end
rule wireName
[a-zA-Z] [a-zA-Z0-9_]* <WireName>
end
rule non_space
!space .
end
rule space
[\s\t]+
end
rule newLine
[\n\r]+
end
rule end_of_file
!.
end
end
我希望解析器提取出像下面这样的 blob。它总是以空行开头Port.
和结尾。
// Port.
output send;
input free;
output fgcg;
output[ 2:0] state_id;
output[ 1:0] stream_id;
`ifdef SIMULATION
output[ 83:0] dbg_id;
`endif
上面提到的规则可以在单独传递时识别文本中的所有行,但我无法提取 blob。另外我只想提取匹配的文本并忽略其余部分。
有人可以指出我正确的方向吗?