1module PascalUnitSyntaxTree where
2
3data PascalUnit =
4    Program Identifier Implementation Phrase
5    | Unit Identifier Interface Implementation (Maybe Initialize) (Maybe Finalize)
6    | System [TypeVarDeclaration]
7    | Redo [TypeVarDeclaration]
8    deriving (Show, Read, Eq)
9data Interface = Interface Uses TypesAndVars
10    deriving (Show, Read, Eq)
11data Implementation = Implementation Uses TypesAndVars
12    deriving (Show, Read, Eq)
13data Identifier = Identifier String BaseType
14    deriving (Show, Read, Eq)
15data TypesAndVars = TypesAndVars [TypeVarDeclaration]
16    deriving (Show, Read, Eq)
17data TypeVarDeclaration = TypeDeclaration Identifier TypeDecl
18    | VarDeclaration Bool Bool ([Identifier], TypeDecl) (Maybe InitExpression)
19    | FunctionDeclaration Identifier Bool Bool Bool TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
20    | OperatorDeclaration String Identifier Bool TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
21    deriving (Show, Read, Eq)
22data TypeDecl = SimpleType Identifier
23    | RangeType Range
24    | Sequence [Identifier]
25    | ArrayDecl (Maybe Range) TypeDecl
26    | RecordType [TypeVarDeclaration] (Maybe [[TypeVarDeclaration]])
27    | PointerTo TypeDecl
28    | String
29    | AString
30    | Set TypeDecl
31    | FunctionType TypeDecl [TypeVarDeclaration]
32    | DeriveType InitExpression
33    | VoidType
34    | VarParamType TypeDecl -- this is a hack
35    deriving (Show, Read, Eq)
36data Range = Range Identifier
37           | RangeFromTo InitExpression InitExpression
38           | RangeInfinite
39    deriving (Show, Read, Eq)
40data Initialize = Initialize String
41    deriving (Show, Read, Eq)
42data Finalize = Finalize String
43    deriving (Show, Read, Eq)
44data Uses = Uses [Identifier]
45    deriving (Show, Read, Eq)
46data Phrase = ProcCall Reference [Expression]
47        | IfThenElse Expression Phrase (Maybe Phrase)
48        | WhileCycle Expression Phrase
49        | RepeatCycle Expression [Phrase]
50        | ForCycle Identifier Expression Expression Phrase Bool -- The last Boolean indicates wether it's up or down counting
51        | WithBlock Reference Phrase
52        | Phrases [Phrase]
53        | SwitchCase Expression [([InitExpression], Phrase)] (Maybe [Phrase])
54        | Assignment Reference Expression
55        | BuiltInFunctionCall [Expression] Reference
56        | NOP
57    deriving (Show, Read, Eq)
58data Expression = Expression String
59    | BuiltInFunCall [Expression] Reference
60    | PrefixOp String Expression
61    | PostfixOp String Expression
62    | BinOp String Expression Expression
63    | StringLiteral String
64    | PCharLiteral String
65    | CharCode String
66    | HexCharCode String
67    | NumberLiteral String
68    | FloatLiteral String
69    | HexNumber String
70    | Reference Reference
71    | SetExpression [Identifier]
72    | Null
73    deriving (Show, Read, Eq)
74data Reference = ArrayElement [Expression] Reference
75    | FunCall [Expression] Reference
76    | TypeCast Identifier Expression
77    | SimpleReference Identifier
78    | Dereference Reference
79    | RecordField Reference Reference
80    | Address Reference
81    | RefExpression Expression
82    deriving (Show, Read, Eq)
83data InitExpression = InitBinOp String InitExpression InitExpression
84    | InitPrefixOp String InitExpression
85    | InitReference Identifier
86    | InitArray [InitExpression]
87    | InitRecord [(Identifier, InitExpression)]
88    | InitFloat String
89    | InitNumber String
90    | InitHexNumber String
91    | InitString String
92    | InitPChar String
93    | InitChar String
94    | BuiltInFunction String [InitExpression]
95    | InitSet [InitExpression]
96    | InitAddress InitExpression
97    | InitNull
98    | InitRange Range
99    | InitTypeCast Identifier InitExpression
100    deriving (Show, Read, Eq)
101
102data BaseType = BTUnknown
103    | BTChar
104    | BTString
105    | BTAString
106    | BTInt Bool -- second param indicates whether signed or not
107    | BTBool
108    | BTFloat
109    | BTRecord String [(String, BaseType)]
110    | BTArray Range BaseType BaseType
111    | BTFunction Bool Bool [(Bool, BaseType)] BaseType -- in (Bool, BaseType), Bool indiciates whether var or not
112    | BTPointerTo BaseType
113    | BTUnresolved String
114    | BTSet BaseType
115    | BTEnum [String]
116    | BTVoid
117    | BTUnit
118    | BTVarParam BaseType
119    deriving (Show, Read, Eq)
120