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 597 - (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 :     in
30 :     app ins ([
31 :     ("break", Tokens.BREAK),
32 :     ("case", Tokens.CASE),
33 :     ("continue", Tokens.CONTINUE),
34 :     ("default", Tokens.DEFAULT),
35 :     ("do", Tokens.DO),
36 :     ("else", Tokens.ELSE),
37 :     ("auto", Tokens.AUTO),
38 :     ("extern", Tokens.EXTERN),
39 :     ("register", Tokens.REGISTER),
40 :     ("static", Tokens.STATIC),
41 :     ("for", Tokens.FOR),
42 :     ("goto", Tokens.GOTO),
43 :     ("if", Tokens.IF),
44 :     ("char", Tokens.CHAR),
45 :     ("double", Tokens.DOUBLE),
46 :     ("enum", Tokens.ENUM),
47 :     ("float", Tokens.FLOAT),
48 :     ("int", Tokens.INT),
49 :     ("long", Tokens.LONG),
50 :     ("short", Tokens.SHORT),
51 :     ("struct", Tokens.STRUCT),
52 :     ("union", Tokens.UNION),
53 :     ("unsigned", Tokens.UNSIGNED),
54 :     ("signed", Tokens.SIGNED),
55 :     ("const", fn p => if ParseControl.constAllowed
56 :     then (Tokens.CONST p)
57 :     else (ParseControl.violation "the keyword 'const' not allowed";
58 :     raise LexError)),
59 :     ("volatile", fn p => if ParseControl.volatileAllowed
60 :     then (Tokens.VOLATILE p)
61 :     else (ParseControl.violation "the keyword 'volatile' not allowed";
62 :     raise LexError)),
63 :     ("void", Tokens.VOID),
64 :     ("sizeof", Tokens.SIZEOF),
65 :     ("typedef", Tokens.TYPEDEF),
66 :     ("return", Tokens.RETURN),
67 :     ("switch", Tokens.SWITCH),
68 :     ("while", Tokens.WHILE)
69 :     ] @
70 :     (if ParseControl.Dkeywords then
71 :     (* tokens for D *)
72 :     [
73 :     ]
74 :     else nil))
75 :    
76 :     end
77 :    
78 :     fun checkToken (s, pos) = let
79 :     val endPos = pos + size s
80 :     val name = Atom.atom s
81 :     in
82 :     case (AtomTable.find keywords name)
83 :     of (SOME tokFn) => tokFn(pos, endPos)
84 :     | NONE =>
85 :     (if TypeDefs.checkTdef(s) = true then
86 :     Tokens.TYPE_NAME(s,pos,endPos)
87 :     else Tokens.ID(s,pos,endPos))
88 :     (* end case *)
89 :     end
90 :    
91 :     end

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