Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Clunky parsing problem, looking for simple solution

by kvale (Monsignor)
on Jun 16, 2002 at 03:26 UTC ( #174894=note: print w/ replies, xml ) Need Help??


in reply to Clunky parsing problem, looking for simple solution

I don't have a snippet to drop into your compiler, but the general way handle this recursive complexity is with grammar. The following grammar (couresty of the Dragon book) describes the structure of your conditionals, and associates each ELSE with the closest unmatched THEN, eliminating potential ambiguity:

<stmt> := <matched-stmt> | <unmatched-stmt> <matched-stmt> := "IF" <expr> "THEN" <matched-stmt> "ELSE" <matched-s +tmt> | <other-stmt> <unmatched-stmt> := "IF" <expr> "THEN" <stmt> | "IF" <expr> "THEN" <matched-stmt> "ELSE" <unmatch +ed-stmt>
other-stmt is any kind of statement other than a conditional.

Given this grammar, one may create a recursive descent parser that implements this grammar: each nonterminal becomes a subroutine, with stmt at the top of the tree (untested code):
sub stmt { my $buf = shift; if (matched_stmt($buf)) { return 1; } elsif (unmatched_stmt($buf)) { return 1; } return 0; } # etc.
A pity that we don't have Perl6 yet, this grammar could be dropped in straightaway :)

-Mark


Comment on Re: Clunky parsing problem, looking for simple solution
Select or Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://174894]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (6)
As of 2014-12-19 01:54 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (70 votes), past polls