[antlr-interest] Beginner needing help with tree grammar

Yves Weißig weissig at rbg.informatik.tu-darmstadt.de
Fri Oct 21 05:00:23 PDT 2011


Hi list,

I'm stucked with a problem in a tree grammar. I'm trying to extent my
grammar from my previous post by adding an output module using
TreeGrammar and String Template. My TreeGrammar looks like this:

prog      : (space | group)+ ;

plaintext : TEXT | AZ | HYPHEN | UNDERSCORE | TILDE | APOSTROPHE | INT ;

command   : ^(COMMAND n=AZ v=INT?) -> command(n={$n.text},v={$v.text}) ;

escape    :
            ^(ESCAPE v=OPEN) -> escape(v={$v.text}) |
            ^(ESCAPE v=CLOSE) -> escape(v={$v.text}) |
            ^(ESCAPE v=BACKSLASH) -> escape(v={$v.text}) |
            ^(ESCAPE v=ASTERISK) -> escape(v={$v.text}) |
            ^(ESCAPE v=HYPHEN) -> escape(v={$v.text}) |
            ^(ESCAPE v=UNDERSCORE) -> escape(v={$v.text}) |
            ^(ESCAPE v=TILDE) -> escape(v={$v.text}) |
            ^(ESCAPE v=HEXESCAPE) -> hexescape(v={$v.text}) ;

space     :
            ^(WS v=WS) -> ws(v={$v.text}) |
            ^(TAB v=TAB) -> tab(v={$v.text}) |
            ^(NEWLINE v=NEWLINE) -> newline(v={$v.text}) ;

delimiter :
            ^(DELIMITER v=WS) -> ws(v={$v.text}) |
            ^(DELIMITER v=TAB) -> tab(v={$v.text}) |
            ^(DELIMITER v=NEWLINE) -> newline(v={$v.text}) ;

group     :
            ^(GROUP v+=space*
              (v+=group v+=space* |
              v+=plaintext v+=space* |
              (v+=command | v+=escape)
              (v+=delimiter v+=space+ | v+=delimiter | ))+) ->
group(v={$v}) ;

Now given the previous example RTF text my parser works fine and gives me:

(WS   ) (GROUP (COMMAND pard) (COMMAND fs 32) (COMMAND b) (DELIMITER  )
NOTES (COMMAND par)) (NEWLINE
) (WS   ) (GROUP (COMMAND pard) (COMMAND fs 26) (DELIMITER  ) Recently
(WS  ) I (WS  ) skimmed (WS  ) (GROUP (COMMAND i) (DELIMITER  )
Structure (WS  ) and (WS  ) Interpretation (WS  ) of (NEWLINE
) (WS    ) Computer (WS  ) Programs) , (WS  ) by (WS  ) Sussman (WS  )
and (WS  ) Abelson , (WS  ) and (WS  ) I (WS  ) think (WS  ) there (WS
) should (NEWLINE
) (WS    ) have (WS  ) been (WS  ) more (WS      ) (TAB 	) (WS  )
pictures . (NEWLINE
) (WS   ) (COMMAND line) (DELIMITER  ) I (WS  ) like (WS  ) pictures .
(WS   ) Is (WS  ) that (WS  ) so (WS  ) na (ESCAPE \'ef) ve ? (NEWLINE
) (WS   ) (COMMAND par))

the tree walker now fails:

node from line 1:0 required (...)+ loop did not match anything at input 'WS'

but there is a WS node at the beginning, what am I doing wrong?

Best regards, Yves


More information about the antlr-interest mailing list