Package StraightLine;

Tokens
	semi = ';';
	lpar = '(';
	rpar = ')';
	comma = ',';
	plus = '+';
	minus = '-';
	times = '*';
	div = '/';
	assign = ':=';	
	print = 'print';
	whitespace = (' ' | '\t' | 13 10  | 10 | 13 )+;  // 13 10 is '\r' '\n'
	num = ['0'..'9']+;
	id = ['a'..'z'] (['a'..'z'] | ['0'..'9'])*;

Ignored Tokens
	whitespace;

Productions
	stm {-> stm} = 
		{compoundstm} [head]:stm semi [tail]:onestm {-> New stm.compoundstm(head.stm, tail.stm) } |
		{onestm} onestm {-> onestm.stm } ;
	onestm {-> stm} =
		{assignstm} id assign exp {-> New stm.assignstm(id,exp)} |
		{printstm} print lpar [explist]:explist rpar {-> New stm.printstm(explist.explist)} ;
	exp {-> exp} =
		{plus} [left]:exp plus [right]:term {-> New exp.plus(left.exp,right.exp) } | 
		{minus} [left]:exp minus [right]:term {-> New exp.minus(left.exp,right.exp) } | 
		{term} term {-> term.exp }|
		{eseqexp} lpar [left]:stm comma [right]:exp rpar {-> New exp.eseqexp(left.stm,right.exp) } ;
	term {-> exp}=  
		{times} [left]:term times [right]:factor {-> New exp.times(left.exp,right.exp) } | 
		{div} [left]:term div [right]:factor {-> New exp.div(left.exp,right.exp) } | 
		{factor} factor {-> factor.exp };
	factor {-> exp} =
		{idexp} id {-> New exp.idexp(id) } |
		{numexp} num {-> New exp.numexp(num) };
	explist {-> explist} =
		{pairexplist} [head]:exp comma [tail]:explist {-> New explist.pairexplist( head.exp, tail.explist) } |
		{lastexplist} exp {-> New explist.lastexplist(exp) };

Abstract Syntax Tree
	stm = 	{compoundstm} [head]:stm [tail]:stm |
		{assignstm} id exp |
		{printstm} [explist]:explist;
	exp =	{idexp} id |
		{numexp} num |
		{plus} [left]:exp [right]:exp |
		{minus} [left]:exp [right]:exp |
		{times} [left]:exp [right]:exp |
		{div} [left]:exp [right]:exp |
		{eseqexp} [left]:stm [right]:exp ;
	explist={pairexplist} [head]:exp [tail]:explist |
		{lastexplist} exp;
