~ubuntu-branches/ubuntu/wily/aspectc++/wily

« back to all changes in this revision

Viewing changes to Puma/gen-release/step1/src/CRecognizer.cc

  • Committer: Bazaar Package Importer
  • Author(s): Reinhard Tartler
  • Date: 2005-12-23 10:49:40 UTC
  • Revision ID: james.westby@ubuntu.com-20051223104940-ig4klhoi991zs7km
Tags: upstream-0.99+1.0pre2
ImportĀ upstreamĀ versionĀ 0.99+1.0pre2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// This file is part of PUMA.
 
2
// Copyright (C) 1999-2003  The PUMA developer team.
 
3
//                                                                
 
4
// This program is free software;  you can redistribute it and/or 
 
5
// modify it under the terms of the GNU General Public License as 
 
6
// published by the Free Software Foundation; either version 2 of 
 
7
// the License, or (at your option) any later version.            
 
8
//                                                                
 
9
// This program is distributed in the hope that it will be useful,
 
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of 
 
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  
 
12
// GNU General Public License for more details.                   
 
13
//                                                                
 
14
// You should have received a copy of the GNU General Public      
 
15
// License along with this program; if not, write to the Free     
 
16
// Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
 
17
// MA  02111-1307  USA                                            
 
18
 
 
19
#include <ctype.h>
 
20
 
 
21
#include "Puma/CRecognizer.h"
 
22
#include "Puma/Source.h"
 
23
 
 
24
// Include token type definitions
 
25
#include "Puma/PreParser.h"
 
26
#include "Puma/CTokens.h"
 
27
#include "Puma/CWildcardTokens.h"
 
28
#include "Puma/CWhitespaceTokens.h"
 
29
#include "Puma/PreMacroOpTokens.h"
 
30
 
 
31
namespace Puma {
 
32
 
 
33
 
 
34
// Include generated scanner tables
 
35
#include "CStringTab.ot"
 
36
#include "PreDirectiveTab.ot"
 
37
#include "PreTokenTab.ot"
 
38
#include "CDirectiveTab.ot"
 
39
#include "CWhitespaceTab.ot"
 
40
#include "CWildcardTab.ot"
 
41
#include "CCoreTab.ot"
 
42
#include "CIdentifierTab.ot"
 
43
 
 
44
 
 
45
// Declaration of orange token recognizer objects
 
46
 
 
47
MappedOrangeRecognizer<CScanBuffer> CRecognizer::string_recognizer (
 
48
  CStringTabMap, CStringTabExprMap,
 
49
  CStringTabStart, CStringTabStates, 
 
50
  CStringTabNext, CStringTabControl, 
 
51
  sizeof (CStringTabNext) / sizeof (int));
 
52
   
 
53
MappedOrangeRecognizer<CScanBuffer> CRecognizer::pre_dir_recognizer (
 
54
  PreDirectiveTabMap, PreDirectiveTabExprMap,
 
55
  PreDirectiveTabStart, PreDirectiveTabStates, 
 
56
  PreDirectiveTabNext, PreDirectiveTabControl, 
 
57
  sizeof (PreDirectiveTabNext) / sizeof (int));
 
58
 
 
59
MappedOrangeRecognizer<CScanBuffer> CRecognizer::pre_token_recognizer (
 
60
  PreTokenTabMap, PreTokenTabExprMap,
 
61
  PreTokenTabStart, PreTokenTabStates, 
 
62
  PreTokenTabNext, PreTokenTabControl, 
 
63
  sizeof (PreTokenTabNext) / sizeof (int));
 
64
 
 
65
OrangeRecognizer<CScanBuffer> CRecognizer::dir_recognizer (
 
66
  CDirectiveTabMap, CDirectiveTabStart, 
 
67
  CDirectiveTabStates, CDirectiveTabNext, 
 
68
  CDirectiveTabControl, 
 
69
  sizeof (CDirectiveTabNext) / sizeof (int));
 
70
 
 
71
MappedOrangeRecognizer<CScanBuffer> CRecognizer::whitespace_recognizer (
 
72
  CWhitespaceTabMap, CWhitespaceTabExprMap, CWhitespaceTabStart, 
 
73
  CWhitespaceTabStates, CWhitespaceTabNext, CWhitespaceTabControl, 
 
74
  sizeof (CWhitespaceTabNext) / sizeof (int));
 
75
 
 
76
MappedOrangeRecognizer<CScanBuffer> CRecognizer::wildcard_recognizer (
 
77
  CWildcardTabMap, CWildcardTabExprMap, CWildcardTabStart, 
 
78
  CWildcardTabStates, CWildcardTabNext, CWildcardTabControl, 
 
79
  sizeof (CWildcardTabNext) / sizeof (int));
 
80
 
 
81
MappedOrangeRecognizer<CScanBuffer> CRecognizer::core_recognizer (
 
82
  CCoreTabMap, CCoreTabExprMap, CCoreTabStart, CCoreTabStates, 
 
83
  CCoreTabNext, CCoreTabControl, sizeof (CCoreTabNext) / sizeof (int));
 
84
 
 
85
MappedOrangeRecognizer<CScanBuffer> CRecognizer::identifier_recognizer (
 
86
  CIdentifierTabMap, CIdentifierTabExprMap, CIdentifierTabStart,
 
87
  CIdentifierTabStates, CIdentifierTabNext, CIdentifierTabControl, 
 
88
  sizeof (CIdentifierTabNext) / sizeof (int));
 
89
 
 
90
 
 
91
// functions
 
92
 
 
93
 
 
94
void CRecognizer::setup (ScanBuffer &buffer) {
 
95
  scan_buffer.decorate (&buffer);
 
96
  comment_recognizer.mode (CCommentRecognizer::NO_COMMENT);
 
97
  check_directive = true;
 
98
  scan_mode = NORMAL;
 
99
  scan_buffer.reset ();
 
100
}
 
101
 
 
102
 
 
103
int CRecognizer::recognize (Lang &lang, int &expr, int &len) {
 
104
  int  result;
 
105
 
 
106
  if (scan_buffer.new_line ()) {
 
107
    scan_mode = NORMAL;
 
108
    check_directive = true;
 
109
  }
 
110
 
 
111
  if ((result = comment_recognizer.recognize (&scan_buffer, expr, len)) != 0) { 
 
112
    lang = COMMENT;
 
113
    return result;
 
114
  }
 
115
  scan_buffer.retry ();
 
116
 
 
117
  if (check_directive && ! macro_ops) {
 
118
    check_directive = false;
 
119
    if ((result = pre_dir_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
120
      if (result > 0) 
 
121
        scan_mode = IN_PRE_DIR;
 
122
      lang = PRE_DIR;
 
123
      return result;
 
124
    }
 
125
    scan_buffer.retry ();
 
126
 
 
127
    if ((result = dir_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
128
      if (result > 0) 
 
129
        scan_mode = IN_COMP_DIR;
 
130
      lang = COMP_DIR;
 
131
      return result;
 
132
    }
 
133
    scan_buffer.retry ();
 
134
  }
 
135
 
 
136
  if ((result = whitespace_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
137
    lang = WHITE;
 
138
    return result;
 
139
  }
 
140
  scan_buffer.retry ();
 
141
 
 
142
  if ((result = string_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
143
    lang = STRING;
 
144
    return result;
 
145
  }
 
146
  scan_buffer.retry ();
 
147
 
 
148
  if (macro_ops || scan_mode == IN_PRE_DIR) {
 
149
    if ((result = pre_token_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
150
      lang = PRE;
 
151
      return result;
 
152
    }
 
153
    scan_buffer.retry ();
 
154
  }
 
155
 
 
156
  if (wildcards) {
 
157
    if ((result = wildcard_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
158
      lang = WILDCARD;
 
159
      return result;
 
160
    }
 
161
    scan_buffer.retry ();
 
162
  }
 
163
 
 
164
  if ((result = core_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
165
    if (expr <= TOK_LAST_CORE) {
 
166
      lang = CORE;
 
167
      return result;
 
168
    }
 
169
    // if it looks like a keyword we have to check if some character follows
 
170
    // that makes it an identifier instead of a keyword
 
171
    scan_buffer.more (len);
 
172
    if (scan_buffer.state () == ScanBuffer::STATE_OK) {
 
173
      char next = scan_buffer.next ();
 
174
      if (isalnum ((int)next) || next == '_')
 
175
        result = 0;
 
176
      scan_buffer.more (len);
 
177
    }
 
178
    if (result &&
 
179
        ((expr <= TOK_LAST_AC && aspectc) ||
 
180
         (expr <= TOK_LAST_CC && std_cplusplus) ||
 
181
         (expr <= TOK_LAST_C  && std_c))) {
 
182
      lang = KEYWORD;
 
183
      return result;
 
184
    }
 
185
  }
 
186
  scan_buffer.retry ();
 
187
 
 
188
  long num = additional_keyword_recognizers.length ();
 
189
  for (long i = 0; i < num; i++) {
 
190
    if ((result = additional_keyword_recognizers[i]->recognize (&scan_buffer, expr, len)) != 0) {
 
191
      lang = KEYWORD;
 
192
      return result;
 
193
    }
 
194
    scan_buffer.retry ();
 
195
  }
 
196
 
 
197
  if ((result = identifier_recognizer.recognize (&scan_buffer, expr, len)) != 0) {
 
198
    lang = ID;
 
199
    return result;
 
200
  }
 
201
  scan_buffer.retry ();
 
202
 
 
203
  lang = UNKNOWN;
 
204
  expr = 0;
 
205
  len  = 1;
 
206
  return 0;
 
207
}
 
208
 
 
209
 
 
210
} // namespace Puma