%namespace NewLanguage %token SYMBOL %nonassoc '<' '>' '=' %left '-' '+' %left '*' '/' %YYSTYPE ParseNode %YYLTYPE SourceLocation %type decl %type expr %type typespec %type typeconstraint %% /* currently we only allow one line. Later we need to extend this to separate statements. */ start: /* empty */ | decl { this.AtTopLevel($1); } | expr { this.AtTopLevel($1); } ; decl : typespec SYMBOL { //Console.WriteLine("Decl \"{0}\"", $1); $$ = new DeclarationNode($1, $2); } ; typespec : SYMBOL { $$ = new TypeSpecNode($1); } | SYMBOL '[' typeconstraint ']' { $$ = new TypeSpecNode($1, $3); } ; typeconstraint : expr { $$ = new ExprListNode(); $$.Add($1); } | typeconstraint ',' expr { $1.Add($3); } ; expr : SYMBOL { $$ = new SymbolRefNode($1); } | expr '+' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '-' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '*' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '/' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '<' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '>' expr { $$ = new OperatorNode($2.str, $1, $3); } | expr '=' expr { $$ = new OperatorNode($2.str, $1, $3); } ; %% private List _topLevel = new List(); public IEnumerable TopLevel { get { return _topLevel.AsReadOnly(); } } private void AtTopLevel(NodeBase node) { _topLevel.Add(node); } public readonly ErrorHandler handler = new ErrorHandler();