1 /* scan.c - lexical analyser for assembler */
11 PRIVATE
int numbase
; /* base for number */
13 PRIVATE
char symofchar
[256] = /* table to convert chars to their symbols */
15 EOLSYM
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
16 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
17 WHITESPACE
, WHITESPACE
, EOLSYM
, WHITESPACE
,
18 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
19 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
20 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
21 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
22 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
24 WHITESPACE
, EOLSYM
, STRINGCONST
, IMMEDIATE
, /* !"# */
25 HEXCONST
, BINCONST
, ANDOP
, CHARCONST
, /* $%&' */
26 LPAREN
, RPAREN
, STAR
, ADDOP
, /* ()*+ */
27 COMMA
, SUBOP
, IDENT
, SLASH
, /* ,-./ */
29 INTCONST
, INTCONST
, INTCONST
, INTCONST
, /* 0123 */
30 INTCONST
, INTCONST
, INTCONST
, INTCONST
, /* 4567 */
31 INTCONST
, INTCONST
, COLON
, EOLSYM
, /* 89:; */
32 LESSTHAN
, EQOP
, GREATERTHAN
, MACROARG
, /* <=>? */
34 INDIRECT
, IDENT
, IDENT
, IDENT
, /* @ABC */
35 IDENT
, IDENT
, IDENT
, IDENT
, /* DEFG */
36 IDENT
, IDENT
, IDENT
, IDENT
, /* HIJK */
37 IDENT
, IDENT
, IDENT
, IDENT
, /* LMNO */
38 IDENT
, IDENT
, IDENT
, IDENT
, /* PQRS */
39 IDENT
, IDENT
, IDENT
, IDENT
, /* TUVW */
40 IDENT
, IDENT
, IDENT
, LBRACKET
, /* XYZ[ */
41 OTHERSYM
, RBRACKET
, OTHERSYM
, IDENT
, /* \]^_ */
43 OTHERSYM
, IDENT
, IDENT
, IDENT
, /* `abc */
44 IDENT
, IDENT
, IDENT
, IDENT
, /* defg */
45 IDENT
, IDENT
, IDENT
, IDENT
, /* hijk */
46 IDENT
, IDENT
, IDENT
, IDENT
, /* lmno */
47 IDENT
, IDENT
, IDENT
, IDENT
, /* pqrs */
48 IDENT
, IDENT
, IDENT
, IDENT
, /* tuvw */
49 IDENT
, IDENT
, IDENT
, OTHERSYM
, /* xyz{ */
50 OROP
, OTHERSYM
, NOTOP
, OTHERSYM
, /* |}~ */
52 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
53 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
54 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
55 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
56 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
57 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
58 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
59 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
61 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
62 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
63 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
64 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
65 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
66 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
67 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
68 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
70 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
71 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
72 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
73 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
74 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
75 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
76 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
77 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
79 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
80 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
81 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
82 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
83 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
84 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
85 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
,
86 WHITESPACE
, WHITESPACE
, WHITESPACE
, WHITESPACE
89 FORWARD
void intconst
P((void));
91 PUBLIC
void context_hexconst()
99 register char *reglineptr
;
101 reglineptr
= lineptr
;
103 symname
= reglineptr
;
104 switch (sym
= symofchar
[(unsigned char) *reglineptr
++])
109 if (*reglineptr
== '+')
117 lineptr
= reglineptr
;
121 if ((number
= *reglineptr
) < ' ')
123 if (*reglineptr
!= EOL
)
127 case GREATERTHAN
: /* context-sensitive */
128 if (*reglineptr
== '>')
136 lineptr
= reglineptr
;
140 /* walk to end of identifier - magic INTCONST is max of INT, IDENT */
141 while (symofchar
[(unsigned char) *reglineptr
] <= INTCONST
)
143 lineptr
= reglineptr
;
147 if (*(reglineptr
- 1) == '0')
149 if (*reglineptr
!= 'x' && *reglineptr
!= 'X')
162 lineptr
= reglineptr
;
165 case LESSTHAN
: /* context-sensitive */
166 if (*reglineptr
== '<')
173 if (*reglineptr
== '-')
180 lineptr
= reglineptr
;
184 PUBLIC
void getsym_nolookup()
194 PRIVATE
void intconst()
196 register char *reglineptr
;
199 reglineptr
= lineptr
;
200 for (; *reglineptr
>= '0'; ++reglineptr
)
202 if (*reglineptr
> '9')
206 if (*reglineptr
>= 'a' && *reglineptr
<= 'f')
209 number
= numbase
* number
+ (*reglineptr
- 'a' + 10);
211 number
= *reglineptr
- 'a' + 10;
213 else if (*reglineptr
>= 'A' && *reglineptr
<= 'F')
216 number
= numbase
* number
+ (*reglineptr
- 'A' + 10);
218 number
= *reglineptr
- 'A' + 10;
223 else if (number
!= 0)
224 number
= numbase
* number
+ (*reglineptr
- '0');
226 number
= *reglineptr
- '0';
228 if (*reglineptr
== 'L' || *reglineptr
== 'l')
231 lineptr
= reglineptr
;
234 PUBLIC
void initscan()
246 lindirect
= LBRACKET
;
248 rindirect
= RBRACKET
;