To add to this (for those unfamiliar with Erlang/OTP): Erlang not only has general pattern matching, but also specific support for pattern matching on binary content (down to bitfields). It's better than C and C++ in that regard in more than one way.
A few hints about the language for the non-functional crowd, then my point
1) Functions can have multiple definitions and are picked top to bottom. The one that runs is the first one matching the arguments in the call.
2) Variables are Capitalized (and can't be assigned again, big surprise.)
3) Atoms (:symbols in other languages) are lower_cased.
4) The arrow (->), the comma (,) and the dot (.) do (more or less) what Java/C do with their { ; } characters (sorry, I have to keep it short)
You can start from the bottom and go through the get_token, get_line, parse_ComponentTypeLists etc, find where they are called and see how they neatly (IMHO) replace the switch statements in other languages.
Is it easier to understand? Hard to tell: if the problem is difficult the code won't be easy. Is it less tangled? I think it is. My point: some languages are messiers than others.
[1] https://github.com/erlang/otp/blob/master/lib/asn1/src/asn1c...