module TestProgs where

import CppAst
import CppToken

-- int foobar;
testProg 0 = [Reserved "int", Identifier "foobar", Semicolon]

-- extern int foobar;
testProg 1 = [
    Reserved "extern",
    Reserved "int",
    Identifier "foobar",
    Semicolon]

-- Function definition with extraneous semicolon
-- int main() {};
testProg 2 =
    [Reserved "int",
    Identifier "main",
    OpenParen,
    CloseParen,
    OpenBrace,
    CloseBrace,
    Semicolon]

-- extern int foobar;
-- int main() {};
testProg 3 = testProg 1 ++ testProg 2

-- void main() { return; }
testProg 4 =
    [Reserved "int"
    ,Identifier "main"
    ,OpenParen
    ,CloseParen
    ,OpenBrace
    ,Reserved "return"
    ,Semicolon
    ,CloseBrace]

-- Variable "fp" (PointerTo (Function 
-- const int (*fp)(void *const**);
testProg 5 =
    [Reserved "const"
    ,Reserved "int"
    ,OpenParen
    ,Asterix
    ,Identifier "fp"
    ,CloseParen
    ,OpenParen
    ,Reserved "void"
    ,Asterix
    ,Reserved "const"
    ,Asterix
    ,Asterix
    ,CloseParen
    ,Semicolon]

-- const int f(void *const**);
testProg 6 =
    [Reserved "const"
    ,Reserved "int"
    ,Identifier "f"
    ,OpenParen
    ,Reserved "void"
    ,Asterix
    ,Reserved "const"
    ,Asterix
    ,Asterix
    ,CloseParen
    ,Semicolon]

-- int *const f;
testProg 7 =
	[Reserved "int"
	,Asterix
	,Reserved "const"
	,Identifier "f"
	,Semicolon]
	
-- char *test(){return "blah";}
testProg 8 =
	[Reserved "char"
	,Asterix
	,Identifier "test"
	,OpenParen
	,CloseParen
	,OpenBrace
	,Reserved "return"
	,StringTok "Blah"
	,Semicolon
	,CloseBrace]

-- char *test();
testProg 11 =
	[Reserved "char"
	,Asterix
	,Identifier "test"
	,OpenParen
	,CloseParen
	,Semicolon]

-- char (*test)();
testProg 12 =
	[Reserved "char"
	,OpenParen
	,Asterix
	,Identifier "test"
	,CloseParen
	,OpenParen
	,CloseParen
	,Semicolon]

-- char *cpa[42];
testProg 9 =
	[Reserved "char"
	,Asterix
	,Identifier "charPointerArray"
	,OpenBracket
	,IntegerTok 42
	,CloseBracket
	,Semicolon]

-- char (*cpa)[42];
testProg 10 =
	[Reserved "char"
	,OpenParen
	,Asterix
	,Identifier "charArrayPointer"
	,CloseParen
	,OpenBracket
	,IntegerTok 42
	,CloseBracket
	,Semicolon]

testRes 9 = [
	Variable
		(DeclaratorId "charPointerArray")
		(ArrayOf
			(ConstantExpr (IntegerConstant 42))
			(PointerTo
				(BuiltinType (Reserved "int") [Reserved "char"])))
		NullExpr]
testRes 10 = [
	Variable
		(DeclaratorId "charArrayPointer")
		(PointerTo
			(ArrayOf
				(ConstantExpr (IntegerConstant 42))
				(BuiltinType (Reserved "int") [Reserved "char"])))
		NullExpr]

