1 This is my work in progress Quake C compiler. There are very few _good_ QC
2 compilers out there on the internet that can be used in the opensource
3 community. There are a lot of mediocre compilers, but no one wants those.
4 This is the solution for that, for once a proper Quake C compiler that is
5 capable of doing proper optimization. The design so far of this compiler
6 is basic, because it doesn't actually compile code yet.
9 This is the common header with all definitions, structures, and
10 constants for everything.
13 This is the error subsystem, this handles the output of good detailed
14 error messages (not currently, but will), with colors and such.
17 This is the lexer, a very small basic step-seek lexer that can be easily
18 changed to add new tokens, very retargetable.
21 This is the core compiler entry, handles switches (will) to toggle on
22 and off certian compiler features.
25 This is the parser which goes over all tokens and generates a parse tree
26 and check for syntax correctness.
29 This is the typedef system, this is a seperate file because it's a lot more
30 complicated than it sounds. This handles all typedefs, and even recrusive
34 These are utilities for the compiler, some things in here include a
35 allocator used for debugging, and some string functions.
38 This implements support for assembling Quake assembler (which doesn't
39 actually exist untill now: documentation of the Quake assembler is below.
40 This also implements (will) inline assembly for the C compiler.
43 This is the file you're currently reading
46 The makefile, when sources are added you should add them to the SRC=
47 line otherwise the build will not pick it up. Trivial stuff, small
48 easy to manage makefile, no need to complicate it.
51 Builds gmqcc, creating a gmqcc binary file in the current
52 directory as the makefile.
55 Cleans the build files left behind by a previous build
57 ////////////////////////////////////////////////////////////////////////
58 ///////////////////// Quake Assembler Documentation ////////////////////
59 ////////////////////////////////////////////////////////////////////////
60 Quake assembler is quite simple: it's just an annotated version of the binary
61 produced by any existing QuakeC compiler, but made cleaner to use, (so that
62 the location of various globals or strings are not required to be known).
65 Using one of the following valid constant typenames, you can declare
66 a constant {FLOAT,VECTOR,FUNCTION,FIELD,ENTITY}, all typenames are
67 proceeded by a colon, and the name (white space doesn't matter).
72 STRING: hello "hello world"
75 Commenting assembly requires the use of either # or ; on the line
76 that you'd like to be ignored by the assembler. You can only comment
77 blank lines, and not lines assembly already exists on.
80 Creating functions is the same as declaring a constant, simply use
81 FUNCTION followed by a colon, and the name (white space doesn't matter)
82 and start the statements for that function on the line after it
88 ADD foo, bar, OFS_RETURN
96 The Quake engine provides some internal functions such as print, to
97 access these you first must declare them and their names. To do this
98 you create a FUNCTION as you currently do. Adding a $ followed by the
99 number of the engine builtin will bind it to that builtin.
106 There are some rules as to what your identifiers can be for functions
107 and constants. All indentifiers mustn't begin with a numeric digit,
108 identifiers cannot include spaces, or tabs; they cannot contain symbols,
109 and they cannot exceed 32768 characters. Identifiers cannot be all
110 capitalized either, as all capatilized identifiers are reserved by the
113 Numeric constants cannot contain special notation such as `1-e10`, all
114 numeric constants have to be numeric, they can contain decmial points
115 and signs (+, -) however.
117 Constants cannot be assigned values of other constants, their value must
118 be fully expressed inspot of the declration.
120 No two identifiers can be the same name, this applies for variables allocated
121 inside a function scope (despite it being considered local).