[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