Gittens Web site
 
Font size:      

Example context sensitive dotted grammar

// A dotted grammar for AnBnCn

terminals
a b

grammar AnBnCn 
{
terminals
          c

nonterminals
        S B C SyntaxError

exception SyntaxError
start S
type int

principles
	.S : .a S;
	a.S : a. a S B C
		 | a. B C
		;

	a.B : a .b;
	b.B : b .b;
	B C.B : .B B C;

	C .C B : C B C. ;
	B C.C : .B C C ;
	b.C B : b B C.;

	c.C : c .c;
	b.C : b .c;

	.SyntaxError : . {% cout << "Syntax error" << endl; %};
{%
public:
	AnBnCn(int s) : cpg_tape(s) {}
	
	void Parse(int i)
	{
		EnterTraceMode();
		TraceAll();
		Run(i);
	}
%}
}

source
{%

void AnBnCn::GetToken(CPG_Symbol<int> &amp;s)
{
	char c;
	cin >> c;

	s.attr = 0;

	if (c == 'a' || c == 'A')
		s.id = AnBnCn::a;
	else if (c == 'b' || c == 'B')
		s.id = AnBnCn::b;
	else if (c == 'c' || c == 'C')
		s.id = AnBnCn::c;
	else
		s.id = 0;
}

%}