Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/ckit/src/parser/grammar/tokentable.sml
ViewVC logotype

Annotation of /sml/trunk/ckit/src/parser/grammar/tokentable.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 802 - (view) (download)

1 : dbm 597 (* Copyright (c) 1998 by Lucent Technologies *)
2 :    
3 :     (***************************************************************************
4 :    
5 :     TOKEN.SML: hash table for token recognition
6 :    
7 :     ***************************************************************************)
8 :    
9 :    
10 :     signature TOKENTABLE =
11 :     sig
12 :     structure Tokens : C_TOKENS
13 :     val checkToken : (string * int) -> (Tokens.svalue,int)Tokens.token
14 :     end
15 :    
16 :     functor TokenTable(structure Tokens : C_TOKENS): TOKENTABLE =
17 :     struct
18 :    
19 :     structure Tokens = Tokens
20 :     structure ParseControl = Config.ParseControl
21 :     type item = (int * int) -> (Tokens.svalue, int) Tokens.token
22 :     exception Keyword
23 :     exception LexError
24 :     val keywords : item AtomTable.hash_table = AtomTable.mkTable(64, Keyword)
25 :    
26 :     val _ = let
27 :     val insert = AtomTable.insert keywords
28 :     fun ins (s, item) = insert (Atom.atom s, item)
29 : blume 802
30 :     (* to enter GCC-style 'underscore'-versions of certain keywords *)
31 :     fun insaug (s, item) = let
32 :     fun item' p = if ParseControl.underscoreKeywords then item p
33 :     else (ParseControl.violation
34 :     (concat ["gcc-style keywords '__", s, "' or '__",
35 :     s, "__' are not allowed"]);
36 :     raise LexError)
37 :     in
38 :     ins ("__" ^ s, item');
39 :     ins ("__" ^ s ^ "__", item')
40 :     end
41 :    
42 :     val normaltokens =
43 :     [("auto", Tokens.AUTO),
44 :     ("extern", Tokens.EXTERN),
45 :     ("register", Tokens.REGISTER),
46 :     ("static", Tokens.STATIC),
47 :     ("unsigned", Tokens.UNSIGNED),
48 :     ("break", Tokens.BREAK),
49 :     ("case", Tokens.CASE),
50 :     ("continue", Tokens.CONTINUE),
51 :     ("default", Tokens.DEFAULT),
52 :     ("do", Tokens.DO),
53 :     ("else", Tokens.ELSE),
54 :     ("for", Tokens.FOR),
55 :     ("goto", Tokens.GOTO),
56 :     ("if", Tokens.IF),
57 :     ("enum", Tokens.ENUM),
58 :     ("float", Tokens.FLOAT),
59 :     ("double", Tokens.DOUBLE),
60 :     ("char", Tokens.CHAR),
61 :     ("int", Tokens.INT),
62 :     ("long", Tokens.LONG),
63 :     ("short", Tokens.SHORT),
64 :     ("struct", Tokens.STRUCT),
65 :     ("union", Tokens.UNION),
66 :     ("void", Tokens.VOID),
67 :     ("sizeof", Tokens.SIZEOF),
68 :     ("typedef", Tokens.TYPEDEF),
69 :     ("return", Tokens.RETURN),
70 :     ("switch", Tokens.SWITCH),
71 :     ("while", Tokens.WHILE)]
72 :    
73 :     (* tokens for which gcc has __* and __*__ versions *)
74 :     val augmentabletokens =
75 :     [("signed", Tokens.SIGNED),
76 :     ("const", fn p => if ParseControl.constAllowed
77 :     then (Tokens.CONST p)
78 :     else (ParseControl.violation
79 :     "the keyword 'const' not allowed";
80 :     raise LexError)),
81 :     ("volatile", fn p => if ParseControl.volatileAllowed
82 :     then (Tokens.VOLATILE p)
83 :     else (ParseControl.violation
84 :     "the keyword 'volatile' not allowed";
85 :     raise LexError))]
86 :    
87 :     (* tokens for D *)
88 :     val dtokens =
89 :     [
90 :     ]
91 : dbm 597 in
92 : blume 802 app ins normaltokens;
93 :     app ins augmentabletokens;
94 :     app insaug augmentabletokens;
95 :     (* enter D keywords only when allowed...
96 :     * (I think the ParseControl test is done at the wrong time here.
97 :     * - Blume) *)
98 :     if ParseControl.Dkeywords then app ins dtokens else ()
99 : dbm 597 end
100 :    
101 :     fun checkToken (s, pos) = let
102 :     val endPos = pos + size s
103 :     val name = Atom.atom s
104 :     in
105 :     case (AtomTable.find keywords name)
106 :     of (SOME tokFn) => tokFn(pos, endPos)
107 :     | NONE =>
108 :     (if TypeDefs.checkTdef(s) = true then
109 :     Tokens.TYPE_NAME(s,pos,endPos)
110 :     else Tokens.ID(s,pos,endPos))
111 :     (* end case *)
112 :     end
113 :    
114 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0