P
Philipp Kempgen
Hi,
I'm looking for a parser which can be fed with some (A)BNF-style rules.
Gave TreeTop a try
---cut---------------------------------------------------------
grammar MathGrammar
rule additive
multitive '+' additive / multitive
end
rule multitive
primary '*' multitive / primary
end
rule primary
'(' additive ')' / number
end
rule number
[1-9] [0-9]*
end
end
---cut---------------------------------------------------------
as well as GhostWheel
---cut---------------------------------------------------------
MathParser = GhostWheel.build_parser {
rule( :additive , alt( :multitive,
seq( :multitive, '+', :additive )
))
rule( :multitive , alt( seq( rimary, '*', :multitive ),
rimary
))
rule( rimary , alt( seq( '(', :additive, ')' ),
:number
))
rule( :number , seq( /[1-9]/ , zplus( /0-9/ ) ))
parser( :main, seqadditive, eof()) )
}
---cut---------------------------------------------------------
'1+1' parses fine.
However when I change the definition of "additive" from
multitive '+' additive / multitive
to
multitive / multitive '+' additive
it fails to parse.
Is this a problem with packrat/PEG parsers in general?
If so, which parser is more appropriate?
It should hand back a parse tree.
Memory consumption is not an issue.
Regards,
Philipp
I'm looking for a parser which can be fed with some (A)BNF-style rules.
Gave TreeTop a try
---cut---------------------------------------------------------
grammar MathGrammar
rule additive
multitive '+' additive / multitive
end
rule multitive
primary '*' multitive / primary
end
rule primary
'(' additive ')' / number
end
rule number
[1-9] [0-9]*
end
end
---cut---------------------------------------------------------
as well as GhostWheel
---cut---------------------------------------------------------
MathParser = GhostWheel.build_parser {
rule( :additive , alt( :multitive,
seq( :multitive, '+', :additive )
))
rule( :multitive , alt( seq( rimary, '*', :multitive ),
rimary
))
rule( rimary , alt( seq( '(', :additive, ')' ),
:number
))
rule( :number , seq( /[1-9]/ , zplus( /0-9/ ) ))
parser( :main, seqadditive, eof()) )
}
---cut---------------------------------------------------------
'1+1' parses fine.
However when I change the definition of "additive" from
multitive '+' additive / multitive
to
multitive / multitive '+' additive
it fails to parse.
Is this a problem with packrat/PEG parsers in general?
If so, which parser is more appropriate?
It should hand back a parse tree.
Memory consumption is not an issue.
Regards,
Philipp