[antlr-interest] Re: Grammar Problem

johnclarke72 johnclarke at hotmail.com
Tue Jun 4 06:57:32 PDT 2002


I put this in the tag parser because I want to go on to write the 
rules that will allow it to process HTML attributes (which may or may 
not exist).  It seems that putting the description of what a whole 
tag looks like in the parser is the best approach.

The main lexer does switch to the tag lexer when it sees <.  

How can I get this to work correctly ?

Thanks

John

--- In antlr-interest at y..., Bogdan Mitu <bogdan_mt at y...> wrote:
> Hi,
> 
> Why rule startHTMLTag starts with INITSTARTTAG, while the others 
not? 
> It seems that you use embedded lexer and parser for HTML tags. You 
probably
> have in the main lexer a rule that recognize '<' and switches the 
lexer. The
> Tag Parser is connected to the second lexer, and will never receive 
the
> INITSTARTTAG token it is expecting in the rule startHTMLTag.
> 
> Try:
> startHTMLTag : /* INITSTARTTAG removed */ tagName:TAGDATA
>                 {System.out.println("STARTTAG : "+tagName.getText
());}
>                 FINISHSTARTTAG;
>  
> Bogdan
> 
> 
> --- johnclarke72 <johnclarke at h...> wrote:
> > Hi,
> >    I am currently having problems with a HTML Grammar that I am 
> > writing.  The Grammar has been added to the end of this e-mail.
> > 
> > When I enter HTML comments (<!-- This is a Comment -->) and End 
Tags 
> > (</endTag>) it handles it correctly.
> > 
> > However,  if I enter <test> or anything similar to this I get 
> > an "line 1: unexpected token: test" error message.  
> > 
> > How can I get this to work ?
> > 
> > I would be grateful for all advice offered regarding this.
> > 
> > John
> > 
> > HTMLTagLexer.g
> > ==============
> > 
> > // Import the required Classes
> > header
> > {
> >    import java.util.*;
> >    import antlr.*;
> > }
> > 
> > // Define the class
> > class HTMLTagLexer extends Lexer;
> > 
> > // Set the options for the Lexer
> > options
> > {
> >   k=3;                             // Set the look ahead to 3 
> > Characters
> >   caseSensitive = false;           // Set Case Sensitivity to 
false
> >   charVocabulary = '\1' .. '\377'; // Set the Lexer Character 
> > Vocabulary
> >   testLiterals = false;            // Don't test against the 
Literals 
> > table
> >   exportVocab = HTMLTagLexer;      // The Grammar to export
> > }
> > 
> > // The routines that will enable us to switch between lexer states
> > {
> >    // The Current Selector
> >    TokenStreamSelector selector;
> > 
> >    // The method that will enable us to switch between lexer 
states
> >    public void setSelector(TokenStreamSelector 
tokenStreamSelector)
> >    {
> >      selector = tokenStreamSelector;
> >    }
> > }
> > 
> > // Define the Tokens required for the Grammar
> > 
> > // Various HTML Marker Tags
> > INITSTARTTAG   : "<";
> > FINISHSTARTTAG : ">";
> > EQUALS         : "=";
> > 
> > // HTML Comments
> > HTMLCOMMENT : "!--"! (options {greedy=false;} : .)* "-->"!
> >               {selector.pop();}
> >               ;
> > 
> > // Main HTML Tags Section.  This defines the Tag names,
> > // attributes and attribute values
> > 
> > // TAGDATA is used to define the Tag Name and names of
> > // attributes used within the tag
> > TAGDATA : (~(' ' | '\r' | '\n' | '\t' | '<' | '>' | '/' | '!' 
| '='))
> > +;
> > 
> > // TAGVALUE is used to define the values for attributes
> > // used within the tags
> > 
> > 
> > // Definition of an End Tag
> > ENDTAG   : '/'! ( 'a'..'z' )+ ">"! {selector.pop();};
> > 
> > // Ignore all White Space
> > WS : ( ' '
> >      | '\t'
> >      | '\r' '\n' { newline(); }
> >      | '\n' { newline(); }
> >      )
> >      {$setType(Token.SKIP);} //ignore this token
> > ;
> > 
> > HTMLTagParser.g
> > ===============
> > 
> > // Define the class
> > class HTMLTagParser extends Parser;
> > 
> > // Set the options for the Parser
> > options
> > {
> >   importVocab = HTMLTagLexer;     // The Grammar to import
> > }
> > 
> > 
> > // The Parser Rules
> > processHTML:
> >    htmlComment:HTMLCOMMENT {System.out.println
> > ("COMMENT : "+htmlComment.getText().trim());}
> >    | startHTMLTag
> >    | endTag:ENDTAG {System.out.println("ENDTAG : "+endTag.getText
> > ());};
> > 
> > startHTMLTag : INITSTARTTAG tagName:TAGDATA
> >                {System.out.println("STARTTAG : "+tagName.getText
());}
> >                FINISHSTARTTAG;
> > 
> > 
> > 
> > 
> >  
> > 
> > Your use of Yahoo! Groups is subject to 
http://docs.yahoo.com/info/terms/ 
> > 
> > 
> > 
> 
> 
> __________________________________________________
> Do You Yahoo!?
> Yahoo! - Official partner of 2002 FIFA World Cup
> http://fifaworldcup.yahoo.com


 

Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ 



More information about the antlr-interest mailing list