[antlr-interest] multilexer - almost, but no cigar.

craigmain001 <craig at palantir.co.za> craig at palantir.co.za
Wed Feb 5 05:44:17 PST 2003


Hi All,

I have got this basic embedded language thing working.
My question is why is foreach encountered twice - what am I missing.

Given the input
++++
this is a test
int i = 0;
[if]
procedure pop;

[foreach]



end
+++++
The output generated is
this is a test
int i = 0;
{foreach encountered}

procedure pop;

{foreach encountered}




end


The grammer declarations are as follows.
header {
#include "antlr/TokenStreamSelector.hpp"
#include <iostream>
}

options
{ language="Cpp"; }

class XGenParser extends Parser;

content : forstatement | ifstatement;

             
ifstatement : "if"
               { std::cout << "{ifstatement encountered}" << 
std::endl; }
            ;
             
forstatement : "foreach"
               { std::cout << "{foreach encountered}" << std::endl; }
             ;

class XGenLexer extends Lexer;
options {
     k=2;
     filter=true;
     importVocab = Common;
}


tokens {
        W_FOREACH="foreach";
        W_IF="if";
}


{
private:
	ANTLR_USE_NAMESPACE(antlr)TokenStreamSelector* selector;
public:
	void setSelector(ANTLR_USE_NAMESPACE(antlr)
TokenStreamSelector* selector_) {
		selector=selector_;
	}
}

CODE_END
	:	"]" {selector->pop(); }
	;


WS_	:	(' '
	|	'\t'
	|	'\n'
	|	'\r')
		{ _ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; }
	;


header {
#include "antlr/TokenStreamSelector.hpp"
#include <iostream>
#include "XGenParser.hpp"
}

options {
        language="Cpp";
}

class CodeParser extends Parser;
options {
        importVocab = Common;
}

content
	:	(xgen)+
	;

xgen
	:	CODE_BEGIN
		{
		XGenParser xgen(getInputState());
		xgen.content();
		}
		
	;


class CodeLexer extends Lexer;
options {
     k=2;
     filter=IGNORE;
     importVocab = Common;
     charVocabulary='\u0000'..'\u007F'; // ASCII
}
{
private:
	ANTLR_USE_NAMESPACE(antlr)TokenStreamSelector* selector;
public:
	void setSelector(ANTLR_USE_NAMESPACE(antlr)
TokenStreamSelector* selector_) {
		selector=selector_;
	}
}

CODE_BEGIN : "[" {selector->push("xgen"); }
           ;

protected
IGNORE
     :  ( "\r\n" | '\r' | '\n' )
         {newline(); std::cout << std::endl;}
     | c:. {std::cout << c;}
     ;



 

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



More information about the antlr-interest mailing list