Mercurial > emacs
annotate lisp/cedet/semantic/lex.el @ 104442:b22b44e953cb
cedet/semantic/chart.el: Don't require semantic/find.
cedet/semantic/complete.el: Don't require semantic/find.
cedet/semantic/decorate.el: Require semantic/tag-file.
(semantic-set-tag-folded-isearch): Require semantic/find.
cedet/semantic/dep.el: Change semantic--dependency-find-file-on-path
into a macro, to avoid compiler warning.
Defvar ede-minor-mode and ede-object.
Declare ede-system-include-path.
cedet/semantic/doc.el: Require semantic/tag-file and semantic/find.
cedet/semantic/edit.el: Require semantic/find and semantic/format.
cedet/semantic/find.el: Defvar semantic-case-fold.
Require semantic.
(semantic-find-tags-external-children-of-type): Require semantic/sort.
(semantic-find-tags-by-scope-protection-default): Require semantic/tag-ls.
cedet/semantic/format.el: Require semantic/tag-ls.
eval-when-compile semantic/find.
(semantic-format-tag-name): Move up to avoid compiler error.
(semantic-format-tag-prototype): Move up to avoid compiler error.
(semantic--format-tag-parent-tree): Require semantic/tag-file.
(semantic-format-tag-short-doc-default): Require semantic/doc.
author | Chong Yidong <cyd@stupidchicken.com> |
---|---|
date | Mon, 31 Aug 2009 02:16:34 +0000 |
parents | b1ac14799f78 |
children | df08b7ab0ba0 |
rev | line source |
---|---|
104416
c13af98da4d6
Fix renamed filenames in file headers.
Chong Yidong <cyd@stupidchicken.com>
parents:
104413
diff
changeset
|
1 ;;; lex.el --- Lexical Analyzer builder |
104413
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
3 ;;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
4 ;;; 2007, 2008, 2009 Free Software Foundation, Inc. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
5 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
6 ;; Author: Eric M. Ludlam <zappo@gnu.org> |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
7 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
8 ;; This file is part of GNU Emacs. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
9 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
10 ;; GNU Emacs is free software: you can redistribute it and/or modify |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
11 ;; it under the terms of the GNU General Public License as published by |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
12 ;; the Free Software Foundation, either version 3 of the License, or |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
13 ;; (at your option) any later version. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
14 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
15 ;; GNU Emacs is distributed in the hope that it will be useful, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
18 ;; GNU General Public License for more details. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
19 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
20 ;; You should have received a copy of the GNU General Public License |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
21 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
22 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
23 ;;; Commentary: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
24 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
25 ;; This file handles the creation of lexical analyzers for different |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
26 ;; languages in Emacs Lisp. The purpose of a lexical analyzer is to |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
27 ;; convert a buffer into a list of lexical tokens. Each token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
28 ;; contains the token class (such as 'number, 'symbol, 'IF, etc) and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
29 ;; the location in the buffer it was found. Optionally, a token also |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
30 ;; contains a string representing what is at the designated buffer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
31 ;; location. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
32 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
33 ;; Tokens are pushed onto a token stream, which is basically a list of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
34 ;; all the lexical tokens from the analyzed region. The token stream |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
35 ;; is then handed to the grammar which parsers the file. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
36 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
37 ;;; How it works |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
38 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
39 ;; Each analyzer specifies a condition and forms. These conditions |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
40 ;; and forms are assembled into a function by `define-lex' that does |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
41 ;; the lexical analysis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
42 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
43 ;; In the lexical analyzer created with `define-lex', each condition |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
44 ;; is tested for a given point. When the conditin is true, the forms |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
45 ;; run. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
46 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
47 ;; The forms can push a lexical token onto the token stream. The |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
48 ;; analyzer forms also must move the current analyzer point. If the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
49 ;; analyzer point is moved without pushing a token, then tne matched |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
50 ;; syntax is effectively ignored, or skipped. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
51 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
52 ;; Thus, starting at the beginning of a region to be analyzed, each |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
53 ;; condition is tested. One will match, and a lexical token might be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
54 ;; pushed, and the point is moved to the end of the lexical token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
55 ;; identified. At the new position, the process occurs again until |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
56 ;; the end of the specified region is reached. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
57 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
58 ;;; How to use semantic-lex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
59 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
60 ;; To create a lexer for a language, use the `define-lex' macro. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
61 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
62 ;; The `define-lex' macro accepts a list of lexical analyzers. Each |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
63 ;; analyzer is created with `define-lex-analyzer', or one of the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
64 ;; derivitive macros. A single analyzer defines a regular expression |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
65 ;; to match text in a buffer, and a short segment of code to create |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
66 ;; one lexical token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
67 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
68 ;; Each analyzer has a NAME, DOC, a CONDITION, and possibly some |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
69 ;; FORMS. The NAME is the name used in `define-lex'. The DOC |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
70 ;; describes what the analyzer should do. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
71 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
72 ;; The CONDITION evaluates the text at the current point in the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
73 ;; current buffer. If CONDITION is true, then the FORMS will be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
74 ;; executed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
75 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
76 ;; The purpose of the FORMS is to push new lexical tokens onto the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
77 ;; list of tokens for the current buffer, and to move point after the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
78 ;; matched text. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
79 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
80 ;; Some macros for creating one analyzer are: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
81 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
82 ;; define-lex-analyzer - A generic analyzer associating any style of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
83 ;; condition to forms. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
84 ;; define-lex-regex-analyzer - Matches a regular expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
85 ;; define-lex-simple-regex-analyzer - Matches a regular expressions, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
86 ;; and pushes the match. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
87 ;; define-lex-block-analyzer - Matches list syntax, and defines |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
88 ;; handles open/close delimiters. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
89 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
90 ;; These macros are used by the grammar compiler when lexical |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
91 ;; information is specified in a grammar: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
92 ;; define-lex- * -type-analyzer - Matches syntax specified in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
93 ;; a grammar, and pushes one token for it. The * would |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
94 ;; be `sexp' for things like lists or strings, and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
95 ;; `string' for things that need to match some special |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
96 ;; string, such as "\\." where a literal match is needed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
97 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
98 ;;; Lexical Tables |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
99 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
100 ;; There are tables of different symbols managed in semantic-lex.el. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
101 ;; They are: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
102 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
103 ;; Lexical keyword table - A Table of symbols declared in a grammar |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
104 ;; file with the %keyword declaration. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
105 ;; Keywords are used by `semantic-lex-symbol-or-keyword' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
106 ;; to create lexical tokens based on the keyword. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
107 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
108 ;; Lexical type table - A table of symbols declared in a grammer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
109 ;; file with the %type declaration. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
110 ;; The grammar compiler uses the type table to create new |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
111 ;; lexical analyzers. These analyzers are then used to when |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
112 ;; a new lexical analyzer is made for a language. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
113 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
114 ;;; Lexical Types |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
115 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
116 ;; A lexical type defines a kind of lexical analyzer that will be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
117 ;; automatically generated from a grammar file based on some |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
118 ;; predetermined attributes. For now these two attributes are |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
119 ;; recognized : |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
120 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
121 ;; * matchdatatype : define the kind of lexical analyzer. That is : |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
122 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
123 ;; - regexp : define a regexp analyzer (see |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
124 ;; `define-lex-regex-type-analyzer') |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
125 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
126 ;; - string : define a string analyzer (see |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
127 ;; `define-lex-string-type-analyzer') |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
128 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
129 ;; - block : define a block type analyzer (see |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
130 ;; `define-lex-block-type-analyzer') |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
131 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
132 ;; - sexp : define a sexp analyzer (see |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
133 ;; `define-lex-sexp-type-analyzer') |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
134 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
135 ;; - keyword : define a keyword analyzer (see |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
136 ;; `define-lex-keyword-type-analyzer') |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
137 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
138 ;; * syntax : define the syntax that matches a syntactic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
139 ;; expression. When syntax is matched the corresponding type |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
140 ;; analyzer is entered and the resulting match data will be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
141 ;; interpreted based on the kind of analyzer (see matchdatatype |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
142 ;; above). |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
143 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
144 ;; The following lexical types are predefined : |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
145 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
146 ;; +-------------+---------------+--------------------------------+ |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
147 ;; | type | matchdatatype | syntax | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
148 ;; +-------------+---------------+--------------------------------+ |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
149 ;; | punctuation | string | "\\(\\s.\\|\\s$\\|\\s'\\)+" | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
150 ;; | keyword | keyword | "\\(\\sw\\|\\s_\\)+" | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
151 ;; | symbol | regexp | "\\(\\sw\\|\\s_\\)+" | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
152 ;; | string | sexp | "\\s\"" | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
153 ;; | number | regexp | semantic-lex-number-expression | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
154 ;; | block | block | "\\s(\\|\\s)" | |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
155 ;; +-------------+---------------+--------------------------------+ |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
156 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
157 ;; In a grammar you must use a %type expression to automatically generate |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
158 ;; the corresponding analyzers of that type. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
159 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
160 ;; Here is an example to auto-generate punctuation analyzers |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
161 ;; with 'matchdatatype and 'syntax predefined (see table above) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
162 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
163 ;; %type <punctuation> ;; will auto-generate this kind of analyzers |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
164 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
165 ;; It is equivalent to write : |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
166 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
167 ;; %type <punctuation> syntax "\\(\\s.\\|\\s$\\|\\s'\\)+" matchdatatype string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
168 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
169 ;; ;; Some punctuations based on the type defines above |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
170 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
171 ;; %token <punctuation> NOT "!" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
172 ;; %token <punctuation> NOTEQ "!=" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
173 ;; %token <punctuation> MOD "%" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
174 ;; %token <punctuation> MODEQ "%=" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
175 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
176 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
177 ;;; On the Semantic 1.x lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
178 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
179 ;; In semantic 1.x, the lexical analyzer was an all purpose routine. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
180 ;; To boost efficiency, the analyzer is now a series of routines that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
181 ;; are constructed at build time into a single routine. This will |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
182 ;; eliminate unneeded if statements to speed the lexer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
183 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
184 (require 'semantic/fw) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
185 ;;; Code: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
186 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
187 ;;; Compatibility |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
188 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
189 (eval-and-compile |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
190 (if (not (fboundp 'with-syntax-table)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
191 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
192 ;; Copied from Emacs 21 for compatibility with released Emacses. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
193 (defmacro with-syntax-table (table &rest body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
194 "With syntax table of current buffer set to a copy of TABLE, evaluate BODY. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
195 The syntax table of the current buffer is saved, BODY is evaluated, and the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
196 saved table is restored, even in case of an abnormal exit. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
197 Value is what BODY returns." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
198 (let ((old-table (make-symbol "table")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
199 (old-buffer (make-symbol "buffer"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
200 `(let ((,old-table (syntax-table)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
201 (,old-buffer (current-buffer))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
202 (unwind-protect |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
203 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
204 (set-syntax-table (copy-syntax-table ,table)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
205 ,@body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
206 (save-current-buffer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
207 (set-buffer ,old-buffer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
208 (set-syntax-table ,old-table)))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
209 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
210 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
211 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
212 ;;; Semantic 2.x lexical analysis |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
213 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
214 (defun semantic-lex-map-symbols (fun table &optional property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
215 "Call function FUN on every symbol in TABLE. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
216 If optional PROPERTY is non-nil, call FUN only on every symbol which |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
217 as a PROPERTY value. FUN receives a symbol as argument." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
218 (if (arrayp table) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
219 (mapatoms |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
220 #'(lambda (symbol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
221 (if (or (null property) (get symbol property)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
222 (funcall fun symbol))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
223 table))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
224 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
225 ;;; Lexical keyword table handling. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
226 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
227 ;; These keywords are keywords defined for using in a grammar with the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
228 ;; %keyword declaration, and are not keywords used in Emacs Lisp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
229 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
230 (defvar semantic-flex-keywords-obarray nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
231 "Buffer local keyword obarray for the lexical analyzer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
232 These keywords are matched explicitly, and converted into special symbols.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
233 (make-variable-buffer-local 'semantic-flex-keywords-obarray) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
234 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
235 (defmacro semantic-lex-keyword-invalid (name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
236 "Signal that NAME is an invalid keyword name." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
237 `(signal 'wrong-type-argument '(semantic-lex-keyword-p ,name))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
238 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
239 (defsubst semantic-lex-keyword-symbol (name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
240 "Return keyword symbol with NAME or nil if not found." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
241 (and (arrayp semantic-flex-keywords-obarray) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
242 (stringp name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
243 (intern-soft name semantic-flex-keywords-obarray))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
244 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
245 (defsubst semantic-lex-keyword-p (name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
246 "Return non-nil if a keyword with NAME exists in the keyword table. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
247 Return nil otherwise." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
248 (and (setq name (semantic-lex-keyword-symbol name)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
249 (symbol-value name))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
250 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
251 (defsubst semantic-lex-keyword-set (name value) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
252 "Set value of keyword with NAME to VALUE and return VALUE." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
253 (set (intern name semantic-flex-keywords-obarray) value)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
254 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
255 (defsubst semantic-lex-keyword-value (name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
256 "Return value of keyword with NAME. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
257 Signal an error if a keyword with NAME does not exist." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
258 (let ((keyword (semantic-lex-keyword-symbol name))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
259 (if keyword |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
260 (symbol-value keyword) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
261 (semantic-lex-keyword-invalid name)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
262 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
263 (defsubst semantic-lex-keyword-put (name property value) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
264 "For keyword with NAME, set its PROPERTY to VALUE." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
265 (let ((keyword (semantic-lex-keyword-symbol name))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
266 (if keyword |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
267 (put keyword property value) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
268 (semantic-lex-keyword-invalid name)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
269 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
270 (defsubst semantic-lex-keyword-get (name property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
271 "For keyword with NAME, return its PROPERTY value." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
272 (let ((keyword (semantic-lex-keyword-symbol name))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
273 (if keyword |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
274 (get keyword property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
275 (semantic-lex-keyword-invalid name)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
276 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
277 (defun semantic-lex-make-keyword-table (specs &optional propspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
278 "Convert keyword SPECS into an obarray and return it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
279 SPECS must be a list of (NAME . TOKSYM) elements, where: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
280 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
281 NAME is the name of the keyword symbol to define. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
282 TOKSYM is the lexical token symbol of that keyword. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
283 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
284 If optional argument PROPSPECS is non nil, then interpret it, and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
285 apply those properties. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
286 PROPSPECS must be a list of (NAME PROPERTY VALUE) elements." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
287 ;; Create the symbol hash table |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
288 (let ((semantic-flex-keywords-obarray (make-vector 13 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
289 spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
290 ;; fill it with stuff |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
291 (while specs |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
292 (setq spec (car specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
293 specs (cdr specs)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
294 (semantic-lex-keyword-set (car spec) (cdr spec))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
295 ;; Apply all properties |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
296 (while propspecs |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
297 (setq spec (car propspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
298 propspecs (cdr propspecs)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
299 (semantic-lex-keyword-put (car spec) (nth 1 spec) (nth 2 spec))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
300 semantic-flex-keywords-obarray)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
301 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
302 (defsubst semantic-lex-map-keywords (fun &optional property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
303 "Call function FUN on every lexical keyword. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
304 If optional PROPERTY is non-nil, call FUN only on every keyword which |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
305 as a PROPERTY value. FUN receives a lexical keyword as argument." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
306 (semantic-lex-map-symbols |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
307 fun semantic-flex-keywords-obarray property)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
308 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
309 (defun semantic-lex-keywords (&optional property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
310 "Return a list of lexical keywords. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
311 If optional PROPERTY is non-nil, return only keywords which have a |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
312 PROPERTY set." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
313 (let (keywords) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
314 (semantic-lex-map-keywords |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
315 #'(lambda (symbol) (setq keywords (cons symbol keywords))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
316 property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
317 keywords)) |
104419
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
318 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
319 ;;; Inline functions: |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
320 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
321 (defvar semantic-lex-unterminated-syntax-end-function) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
322 (defvar semantic-lex-analysis-bounds) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
323 (defvar semantic-lex-end-point) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
324 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
325 (defsubst semantic-lex-token-bounds (token) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
326 "Fetch the start and end locations of the lexical token TOKEN. |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
327 Return a pair (START . END)." |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
328 (if (not (numberp (car (cdr token)))) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
329 (cdr (cdr token)) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
330 (cdr token))) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
331 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
332 (defsubst semantic-lex-token-start (token) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
333 "Fetch the start position of the lexical token TOKEN. |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
334 See also the function `semantic-lex-token'." |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
335 (car (semantic-lex-token-bounds token))) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
336 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
337 (defsubst semantic-lex-token-end (token) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
338 "Fetch the end position of the lexical token TOKEN. |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
339 See also the function `semantic-lex-token'." |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
340 (cdr (semantic-lex-token-bounds token))) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
341 |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
342 (defsubst semantic-lex-unterminated-syntax-detected (syntax) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
343 "Inside a lexical analyzer, use this when unterminated syntax was found. |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
344 Argument SYNTAX indicates the type of syntax that is unterminated. |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
345 The job of this function is to move (point) to a new logical location |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
346 so that analysis can continue, if possible." |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
347 (goto-char |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
348 (funcall semantic-lex-unterminated-syntax-end-function |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
349 syntax |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
350 (car semantic-lex-analysis-bounds) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
351 (cdr semantic-lex-analysis-bounds) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
352 )) |
b1ac14799f78
cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents:
104416
diff
changeset
|
353 (setq semantic-lex-end-point (point))) |
104413
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
354 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
355 ;;; Type table handling. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
356 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
357 ;; The lexical type table manages types that occur in a grammar file |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
358 ;; with the %type declaration. Types represent different syntaxes. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
359 ;; See code for `semantic-lex-preset-default-types' for the classic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
360 ;; types of syntax. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
361 (defvar semantic-lex-types-obarray nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
362 "Buffer local types obarray for the lexical analyzer.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
363 (make-variable-buffer-local 'semantic-lex-types-obarray) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
364 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
365 (defmacro semantic-lex-type-invalid (type) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
366 "Signal that TYPE is an invalid lexical type name." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
367 `(signal 'wrong-type-argument '(semantic-lex-type-p ,type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
368 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
369 (defsubst semantic-lex-type-symbol (type) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
370 "Return symbol with TYPE or nil if not found." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
371 (and (arrayp semantic-lex-types-obarray) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
372 (stringp type) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
373 (intern-soft type semantic-lex-types-obarray))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
374 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
375 (defsubst semantic-lex-type-p (type) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
376 "Return non-nil if a symbol with TYPE name exists." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
377 (and (setq type (semantic-lex-type-symbol type)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
378 (symbol-value type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
379 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
380 (defsubst semantic-lex-type-set (type value) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
381 "Set value of symbol with TYPE name to VALUE and return VALUE." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
382 (set (intern type semantic-lex-types-obarray) value)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
383 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
384 (defsubst semantic-lex-type-value (type &optional noerror) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
385 "Return value of symbol with TYPE name. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
386 If optional argument NOERROR is non-nil return nil if a symbol with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
387 TYPE name does not exist. Otherwise signal an error." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
388 (let ((sym (semantic-lex-type-symbol type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
389 (if sym |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
390 (symbol-value sym) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
391 (unless noerror |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
392 (semantic-lex-type-invalid type))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
393 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
394 (defsubst semantic-lex-type-put (type property value &optional add) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
395 "For symbol with TYPE name, set its PROPERTY to VALUE. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
396 If optional argument ADD is non-nil, create a new symbol with TYPE |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
397 name if it does not already exist. Otherwise signal an error." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
398 (let ((sym (semantic-lex-type-symbol type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
399 (unless sym |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
400 (or add (semantic-lex-type-invalid type)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
401 (semantic-lex-type-set type nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
402 (setq sym (semantic-lex-type-symbol type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
403 (put sym property value))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
404 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
405 (defsubst semantic-lex-type-get (type property &optional noerror) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
406 "For symbol with TYPE name, return its PROPERTY value. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
407 If optional argument NOERROR is non-nil return nil if a symbol with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
408 TYPE name does not exist. Otherwise signal an error." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
409 (let ((sym (semantic-lex-type-symbol type))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
410 (if sym |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
411 (get sym property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
412 (unless noerror |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
413 (semantic-lex-type-invalid type))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
414 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
415 (defun semantic-lex-preset-default-types () |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
416 "Install useful default properties for well known types." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
417 (semantic-lex-type-put "punctuation" 'matchdatatype 'string t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
418 (semantic-lex-type-put "punctuation" 'syntax "\\(\\s.\\|\\s$\\|\\s'\\)+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
419 (semantic-lex-type-put "keyword" 'matchdatatype 'keyword t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
420 (semantic-lex-type-put "keyword" 'syntax "\\(\\sw\\|\\s_\\)+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
421 (semantic-lex-type-put "symbol" 'matchdatatype 'regexp t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
422 (semantic-lex-type-put "symbol" 'syntax "\\(\\sw\\|\\s_\\)+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
423 (semantic-lex-type-put "string" 'matchdatatype 'sexp t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
424 (semantic-lex-type-put "string" 'syntax "\\s\"") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
425 (semantic-lex-type-put "number" 'matchdatatype 'regexp t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
426 (semantic-lex-type-put "number" 'syntax 'semantic-lex-number-expression) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
427 (semantic-lex-type-put "block" 'matchdatatype 'block t) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
428 (semantic-lex-type-put "block" 'syntax "\\s(\\|\\s)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
429 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
430 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
431 (defun semantic-lex-make-type-table (specs &optional propspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
432 "Convert type SPECS into an obarray and return it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
433 SPECS must be a list of (TYPE . TOKENS) elements, where: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
434 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
435 TYPE is the name of the type symbol to define. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
436 TOKENS is an list of (TOKSYM . MATCHER) elements, where: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
437 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
438 TOKSYM is any lexical token symbol. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
439 MATCHER is a string or regexp a text must match to be a such |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
440 lexical token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
441 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
442 If optional argument PROPSPECS is non nil, then interpret it, and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
443 apply those properties. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
444 PROPSPECS must be a list of (TYPE PROPERTY VALUE)." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
445 ;; Create the symbol hash table |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
446 (let* ((semantic-lex-types-obarray (make-vector 13 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
447 spec type tokens token alist default) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
448 ;; fill it with stuff |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
449 (while specs |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
450 (setq spec (car specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
451 specs (cdr specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
452 type (car spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
453 tokens (cdr spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
454 default nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
455 alist nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
456 (while tokens |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
457 (setq token (car tokens) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
458 tokens (cdr tokens)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
459 (if (cdr token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
460 (setq alist (cons token alist)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
461 (setq token (car token)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
462 (if default |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
463 (message |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
464 "*Warning* default value of <%s> tokens changed to %S, was %S" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
465 type default token)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
466 (setq default token))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
467 ;; Ensure the default matching spec is the first one. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
468 (semantic-lex-type-set type (cons default (nreverse alist)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
469 ;; Install useful default types & properties |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
470 (semantic-lex-preset-default-types) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
471 ;; Apply all properties |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
472 (while propspecs |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
473 (setq spec (car propspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
474 propspecs (cdr propspecs)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
475 ;; Create the type if necessary. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
476 (semantic-lex-type-put (car spec) (nth 1 spec) (nth 2 spec) t)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
477 semantic-lex-types-obarray)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
478 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
479 (defsubst semantic-lex-map-types (fun &optional property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
480 "Call function FUN on every lexical type. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
481 If optional PROPERTY is non-nil, call FUN only on every type symbol |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
482 which as a PROPERTY value. FUN receives a type symbol as argument." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
483 (semantic-lex-map-symbols |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
484 fun semantic-lex-types-obarray property)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
485 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
486 (defun semantic-lex-types (&optional property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
487 "Return a list of lexical type symbols. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
488 If optional PROPERTY is non-nil, return only type symbols which have |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
489 PROPERTY set." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
490 (let (types) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
491 (semantic-lex-map-types |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
492 #'(lambda (symbol) (setq types (cons symbol types))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
493 property) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
494 types)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
495 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
496 ;;; Lexical Analyzer framework settings |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
497 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
498 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
499 (defvar semantic-lex-analyzer 'semantic-flex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
500 "The lexical analyzer used for a given buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
501 See `semantic-lex' for documentation. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
502 For compatibility with Semantic 1.x it defaults to `semantic-flex'.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
503 (make-variable-buffer-local 'semantic-lex-analyzer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
504 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
505 (defvar semantic-lex-tokens |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
506 '( |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
507 (bol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
508 (charquote) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
509 (close-paren) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
510 (comment) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
511 (newline) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
512 (open-paren) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
513 (punctuation) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
514 (semantic-list) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
515 (string) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
516 (symbol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
517 (whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
518 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
519 "An alist of of semantic token types. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
520 As of December 2001 (semantic 1.4beta13), this variable is not used in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
521 any code. The only use is to refer to the doc-string from elsewhere. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
522 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
523 The key to this alist is the symbol representing token type that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
524 \\[semantic-flex] returns. These are |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
525 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
526 - bol: Empty string matching a beginning of line. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
527 This token is produced with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
528 `semantic-lex-beginning-of-line'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
529 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
530 - charquote: String sequences that match `\\s\\+' regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
531 This token is produced with `semantic-lex-charquote'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
532 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
533 - close-paren: Characters that match `\\s)' regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
534 These are typically `)', `}', `]', etc. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
535 This token is produced with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
536 `semantic-lex-close-paren'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
537 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
538 - comment: A comment chunk. These token types are not |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
539 produced by default. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
540 This token is produced with `semantic-lex-comments'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
541 Comments are ignored with `semantic-lex-ignore-comments'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
542 Comments are treated as whitespace with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
543 `semantic-lex-comments-as-whitespace'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
544 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
545 - newline Characters matching `\\s-*\\(\n\\|\\s>\\)' regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
546 This token is produced with `semantic-lex-newline'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
547 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
548 - open-paren: Characters that match `\\s(' regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
549 These are typically `(', `{', `[', etc. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
550 If `semantic-lex-paren-or-list' is used, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
551 then `open-paren' is not usually generated unless |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
552 the `depth' argument to \\[semantic-lex] is |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
553 greater than 0. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
554 This token is always produced if the analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
555 `semantic-lex-open-paren' is used. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
556 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
557 - punctuation: Characters matching `{\\(\\s.\\|\\s$\\|\\s'\\)' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
558 regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
559 This token is produced with `semantic-lex-punctuation'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
560 Always specify this analyzer after the comment |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
561 analyzer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
562 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
563 - semantic-list: String delimited by matching parenthesis, braces, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
564 etc. that the lexer skipped over, because the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
565 `depth' parameter to \\[semantic-flex] was not high |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
566 enough. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
567 This token is produced with `semantic-lex-paren-or-list'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
568 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
569 - string: Quoted strings, i.e., string sequences that start |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
570 and end with characters matching `\\s\"' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
571 regexp. The lexer relies on @code{forward-sexp} to |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
572 find the matching end. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
573 This token is produced with `semantic-lex-string'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
574 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
575 - symbol: String sequences that match `\\(\\sw\\|\\s_\\)+' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
576 regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
577 This token is produced with |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
578 `semantic-lex-symbol-or-keyword'. Always add this analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
579 after `semantic-lex-number', or other analyzers that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
580 match its regular expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
581 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
582 - whitespace: Characters that match `\\s-+' regexp. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
583 This token is produced with `semantic-lex-whitespace'.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
584 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
585 (defvar semantic-lex-syntax-modifications nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
586 "Changes to the syntax table for this buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
587 These changes are active only while the buffer is being flexed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
588 This is a list where each element has the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
589 (CHAR CLASS) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
590 CHAR is the char passed to `modify-syntax-entry', |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
591 and CLASS is the string also passed to `modify-syntax-entry' to define |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
592 what syntax class CHAR has.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
593 (make-variable-buffer-local 'semantic-lex-syntax-modifications) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
594 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
595 (defvar semantic-lex-syntax-table nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
596 "Syntax table used by lexical analysis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
597 See also `semantic-lex-syntax-modifications'.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
598 (make-variable-buffer-local 'semantic-lex-syntax-table) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
599 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
600 (defvar semantic-lex-comment-regex nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
601 "Regular expression for identifying comment start during lexical analysis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
602 This may be automatically set when semantic initializes in a mode, but |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
603 may need to be overriden for some special languages.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
604 (make-variable-buffer-local 'semantic-lex-comment-regex) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
605 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
606 (defvar semantic-lex-number-expression |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
607 ;; This expression was written by David Ponce for Java, and copied |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
608 ;; here for C and any other similar language. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
609 (eval-when-compile |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
610 (concat "\\(" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
611 "\\<[0-9]+[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
612 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
613 "\\<[0-9]+[.][eE][-+]?[0-9]+[fFdD]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
614 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
615 "\\<[0-9]+[.][fFdD]\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
616 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
617 "\\<[0-9]+[.]" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
618 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
619 "[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
620 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
621 "\\<[0-9]+[eE][-+]?[0-9]+[fFdD]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
622 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
623 "\\<0[xX][0-9a-fA-F]+[lL]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
624 "\\|" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
625 "\\<[0-9]+[lLfFdD]?\\>" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
626 "\\)" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
627 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
628 "Regular expression for matching a number. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
629 If this value is nil, no number extraction is done during lex. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
630 This expression tries to match C and Java like numbers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
631 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
632 DECIMAL_LITERAL: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
633 [1-9][0-9]* |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
634 ; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
635 HEX_LITERAL: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
636 0[xX][0-9a-fA-F]+ |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
637 ; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
638 OCTAL_LITERAL: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
639 0[0-7]* |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
640 ; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
641 INTEGER_LITERAL: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
642 <DECIMAL_LITERAL>[lL]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
643 | <HEX_LITERAL>[lL]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
644 | <OCTAL_LITERAL>[lL]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
645 ; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
646 EXPONENT: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
647 [eE][+-]?[09]+ |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
648 ; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
649 FLOATING_POINT_LITERAL: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
650 [0-9]+[.][0-9]*<EXPONENT>?[fFdD]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
651 | [.][0-9]+<EXPONENT>?[fFdD]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
652 | [0-9]+<EXPONENT>[fFdD]? |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
653 | [0-9]+<EXPONENT>?[fFdD] |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
654 ;") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
655 (make-variable-buffer-local 'semantic-lex-number-expression) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
656 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
657 (defvar semantic-lex-depth 0 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
658 "Default lexing depth. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
659 This specifies how many lists to create tokens in.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
660 (make-variable-buffer-local 'semantic-lex-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
661 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
662 (defvar semantic-lex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
663 (lambda (syntax syntax-start lex-end) lex-end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
664 "Function called when unterminated syntax is encountered. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
665 This should be set to one function. That function should take three |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
666 parameters. The SYNTAX, or type of syntax which is unterminated. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
667 SYNTAX-START where the broken syntax begins. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
668 LEX-END is where the lexical analysis was asked to end. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
669 This function can be used for languages that can intelligently fix up |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
670 broken syntax, or the exit lexical analysis via `throw' or `signal' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
671 when finding unterminated syntax.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
672 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
673 ;;; Interactive testing commands |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
674 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
675 (defun semantic-lex-test (arg) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
676 "Test the semantic lexer in the current buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
677 If universal argument ARG, then try the whole buffer." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
678 (interactive "P") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
679 (let* ((start (current-time)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
680 (result (semantic-lex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
681 (if arg (point-min) (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
682 (point-max))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
683 (end (current-time))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
684 (message "Elapsed Time: %.2f seconds." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
685 (semantic-elapsed-time start end)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
686 (pop-to-buffer "*Lexer Output*") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
687 (require 'pp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
688 (erase-buffer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
689 (insert (pp-to-string result)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
690 (goto-char (point-min)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
691 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
692 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
693 (defun semantic-lex-test-full-depth (arg) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
694 "Test the semantic lexer in the current buffer parsing through lists. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
695 Usually the lexer parses |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
696 If universal argument ARG, then try the whole buffer." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
697 (interactive "P") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
698 (let* ((start (current-time)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
699 (result (semantic-lex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
700 (if arg (point-min) (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
701 (point-max) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
702 100)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
703 (end (current-time))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
704 (message "Elapsed Time: %.2f seconds." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
705 (semantic-elapsed-time start end)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
706 (pop-to-buffer "*Lexer Output*") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
707 (require 'pp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
708 (erase-buffer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
709 (insert (pp-to-string result)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
710 (goto-char (point-min)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
711 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
712 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
713 (defun semantic-lex-test-region (beg end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
714 "Test the semantic lexer in the current buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
715 Analyze the area between BEG and END." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
716 (interactive "r") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
717 (let ((result (semantic-lex beg end))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
718 (pop-to-buffer "*Lexer Output*") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
719 (require 'pp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
720 (erase-buffer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
721 (insert (pp-to-string result)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
722 (goto-char (point-min)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
723 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
724 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
725 (defvar semantic-lex-debug nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
726 "When non-nil, debug the local lexical analyzer.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
727 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
728 (defun semantic-lex-debug (arg) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
729 "Debug the semantic lexer in the current buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
730 Argument ARG specifies of the analyze the whole buffer, or start at point. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
731 While engaged, each token identified by the lexer will be highlighted |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
732 in the target buffer A description of the current token will be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
733 displayed in the minibuffer. Press SPC to move to the next lexical token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
734 (interactive "P") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
735 (require 'semantic/debug) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
736 (let ((semantic-lex-debug t)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
737 (semantic-lex-test arg))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
738 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
739 (defun semantic-lex-highlight-token (token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
740 "Highlight the lexical TOKEN. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
741 TOKEN is a lexical token with a START And END position. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
742 Return the overlay." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
743 (let ((o (semantic-make-overlay (semantic-lex-token-start token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
744 (semantic-lex-token-end token)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
745 (semantic-overlay-put o 'face 'highlight) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
746 o)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
747 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
748 (defsubst semantic-lex-debug-break (token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
749 "Break during lexical analysis at TOKEN." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
750 (when semantic-lex-debug |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
751 (let ((o nil)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
752 (unwind-protect |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
753 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
754 (when token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
755 (setq o (semantic-lex-highlight-token token))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
756 (semantic-read-event |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
757 (format "%S :: SPC - continue" token)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
758 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
759 (when o |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
760 (semantic-overlay-delete o)))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
761 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
762 ;;; Lexical analyzer creation |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
763 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
764 ;; Code for creating a lex function from lists of analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
765 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
766 ;; A lexical analyzer is created from a list of individual analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
767 ;; Each individual analyzer specifies a single match, and code that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
768 ;; goes with it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
769 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
770 ;; Creation of an analyzer assembles these analyzers into a new function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
771 ;; with the behaviors of all the individual analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
772 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
773 (defmacro semantic-lex-one-token (analyzers) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
774 "Calculate one token from the current buffer at point. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
775 Uses locally bound variables from `define-lex'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
776 Argument ANALYZERS is the list of analyzers being used." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
777 (cons 'cond (mapcar #'symbol-value analyzers))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
778 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
779 (defvar semantic-lex-end-point nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
780 "The end point as tracked through lexical functions.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
781 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
782 (defvar semantic-lex-current-depth nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
783 "The current depth as tracked through lexical functions.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
784 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
785 (defvar semantic-lex-maximum-depth nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
786 "The maximum depth of parenthisis as tracked through lexical functions.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
787 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
788 (defvar semantic-lex-token-stream nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
789 "The current token stream we are collecting.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
790 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
791 (defvar semantic-lex-analysis-bounds nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
792 "The bounds of the current analysis.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
793 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
794 (defvar semantic-lex-block-streams nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
795 "Streams of tokens inside collapsed blocks. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
796 This is an alist of (ANCHOR . STREAM) elements where ANCHOR is the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
797 start position of the block, and STREAM is the list of tokens in that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
798 block.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
799 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
800 (defvar semantic-lex-reset-hooks nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
801 "List of hooks major-modes use to reset lexical analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
802 Hooks are called with START and END values for the current lexical pass. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
803 Should be set with `add-hook'specifying a LOCAL option.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
804 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
805 ;; Stack of nested blocks. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
806 (defvar semantic-lex-block-stack nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
807 ;;(defvar semantic-lex-timeout 5 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
808 ;; "*Number of sections of lexing before giving up.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
809 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
810 (defmacro define-lex (name doc &rest analyzers) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
811 "Create a new lexical analyzer with NAME. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
812 DOC is a documentation string describing this analyzer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
813 ANALYZERS are small code snippets of analyzers to use when |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
814 building the new NAMED analyzer. Only use analyzers which |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
815 are written to be used in `define-lex'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
816 Each analyzer should be an analyzer created with `define-lex-analyzer'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
817 Note: The order in which analyzers are listed is important. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
818 If two analyzers can match the same text, it is important to order the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
819 analyzers so that the one you want to match first occurs first. For |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
820 example, it is good to put a numbe analyzer in front of a symbol |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
821 analyzer which might mistake a number for as a symbol." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
822 `(defun ,name (start end &optional depth length) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
823 ,(concat doc "\nSee `semantic-lex' for more information.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
824 ;; Make sure the state of block parsing starts over. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
825 (setq semantic-lex-block-streams nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
826 ;; Allow specialty reset items. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
827 (run-hook-with-args 'semantic-lex-reset-hooks start end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
828 ;; Lexing state. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
829 (let* (;(starttime (current-time)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
830 (starting-position (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
831 (semantic-lex-token-stream nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
832 (semantic-lex-block-stack nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
833 (tmp-start start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
834 (semantic-lex-end-point start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
835 (semantic-lex-current-depth 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
836 ;; Use the default depth when not specified. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
837 (semantic-lex-maximum-depth |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
838 (or depth semantic-lex-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
839 ;; Bounds needed for unterminated syntax |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
840 (semantic-lex-analysis-bounds (cons start end)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
841 ;; This entry prevents text properties from |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
842 ;; confusing our lexical analysis. See Emacs 22 (CVS) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
843 ;; version of C++ mode with template hack text properties. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
844 (parse-sexp-lookup-properties nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
845 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
846 ;; Maybe REMOVE THIS LATER. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
847 ;; Trying to find incremental parser bug. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
848 (when (> end (point-max)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
849 (error ,(format "%s: end (%%d) > point-max (%%d)" name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
850 end (point-max))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
851 (with-syntax-table semantic-lex-syntax-table |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
852 (goto-char start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
853 (while (and (< (point) end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
854 (or (not length) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
855 (<= (length semantic-lex-token-stream) length))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
856 (semantic-lex-one-token ,analyzers) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
857 (when (eq semantic-lex-end-point tmp-start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
858 (error ,(format "%s: endless loop at %%d, after %%S" name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
859 tmp-start (car semantic-lex-token-stream))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
860 (setq tmp-start semantic-lex-end-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
861 (goto-char semantic-lex-end-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
862 ;;(when (> (semantic-elapsed-time starttime (current-time)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
863 ;; semantic-lex-timeout) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
864 ;; (error "Timeout during lex at char %d" (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
865 (semantic-throw-on-input 'lex) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
866 (semantic-lex-debug-break (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
867 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
868 ;; Check that there is no unterminated block. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
869 (when semantic-lex-block-stack |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
870 (let* ((last (pop semantic-lex-block-stack)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
871 (blk last)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
872 (while blk |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
873 (message |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
874 ,(format "%s: `%%s' block from %%S is unterminated" name) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
875 (car blk) (cadr blk)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
876 (setq blk (pop semantic-lex-block-stack))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
877 (semantic-lex-unterminated-syntax-detected (car last)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
878 ;; Return to where we started. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
879 ;; Do not wrap in protective stuff so that if there is an error |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
880 ;; thrown, the user knows where. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
881 (goto-char starting-position) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
882 ;; Return the token stream |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
883 (nreverse semantic-lex-token-stream)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
884 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
885 ;;; Collapsed block tokens delimited by any tokens. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
886 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
887 (defun semantic-lex-start-block (syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
888 "Mark the last read token as the beginning of a SYNTAX block." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
889 (if (or (not semantic-lex-maximum-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
890 (< semantic-lex-current-depth semantic-lex-maximum-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
891 (setq semantic-lex-current-depth (1+ semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
892 (push (list syntax (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
893 semantic-lex-block-stack))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
894 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
895 (defun semantic-lex-end-block (syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
896 "Process the end of a previously marked SYNTAX block. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
897 That is, collapse the tokens inside that block, including the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
898 beginning and end of block tokens, into a high level block token of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
899 class SYNTAX. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
900 The token at beginning of block is the one marked by a previous call |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
901 to `semantic-lex-start-block'. The current token is the end of block. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
902 The collapsed tokens are saved in `semantic-lex-block-streams'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
903 (if (null semantic-lex-block-stack) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
904 (setq semantic-lex-current-depth (1- semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
905 (let* ((stream semantic-lex-token-stream) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
906 (blk (pop semantic-lex-block-stack)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
907 (bstream (cdr blk)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
908 (first (car bstream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
909 (last (pop stream)) ;; The current token mark the EOBLK |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
910 tok) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
911 (if (not (eq (car blk) syntax)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
912 ;; SYNTAX doesn't match the syntax of the current block in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
913 ;; the stack. So we encountered the end of the SYNTAX block |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
914 ;; before the end of the current one in the stack which is |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
915 ;; signaled unterminated. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
916 (semantic-lex-unterminated-syntax-detected (car blk)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
917 ;; Move tokens found inside the block from the main stream |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
918 ;; into a separate block stream. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
919 (while (and stream (not (eq (setq tok (pop stream)) first))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
920 (push tok bstream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
921 ;; The token marked as beginning of block was not encountered. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
922 ;; This should not happen! |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
923 (or (eq tok first) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
924 (error "Token %S not found at beginning of block `%s'" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
925 first syntax)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
926 ;; Save the block stream for future reuse, to avoid to redo |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
927 ;; the lexical analysis of the block content! |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
928 ;; Anchor the block stream with its start position, so we can |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
929 ;; use: (cdr (assq start semantic-lex-block-streams)) to |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
930 ;; quickly retrieve the lexical stream associated to a block. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
931 (setcar blk (semantic-lex-token-start first)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
932 (setcdr blk (nreverse bstream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
933 (push blk semantic-lex-block-streams) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
934 ;; In the main stream, replace the tokens inside the block by |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
935 ;; a high level block token of class SYNTAX. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
936 (setq semantic-lex-token-stream stream) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
937 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
938 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
939 syntax (car blk) (semantic-lex-token-end last))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
940 )))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
941 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
942 ;;; Lexical token API |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
943 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
944 ;; Functions for accessing parts of a token. Use these functions |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
945 ;; instead of accessing the list structure directly because the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
946 ;; contents of the lexical may change. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
947 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
948 (defmacro semantic-lex-token (symbol start end &optional str) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
949 "Create a lexical token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
950 SYMBOL is a symbol representing the class of syntax found. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
951 START and END define the bounds of the token in the current buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
952 Optional STR is the string for the token iff the the bounds |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
953 in the buffer do not cover the string they represent. (As from |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
954 macro expansion.)" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
955 ;; This if statement checks the existance of a STR argument at |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
956 ;; compile time, where STR is some symbol or constant. If the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
957 ;; variable STr (runtime) is nil, this will make an incorrect decision. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
958 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
959 ;; It is like this to maintain the original speed of the compiled |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
960 ;; code. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
961 (if str |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
962 `(cons ,symbol (cons ,str (cons ,start ,end))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
963 `(cons ,symbol (cons ,start ,end)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
964 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
965 (defun semantic-lex-token-p (thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
966 "Return non-nil if THING is a semantic lex token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
967 This is an exhaustively robust check." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
968 (and (consp thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
969 (symbolp (car thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
970 (or (and (numberp (nth 1 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
971 (numberp (nthcdr 2 thing))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
972 (and (stringp (nth 1 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
973 (numberp (nth 2 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
974 (numberp (nthcdr 3 thing))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
975 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
976 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
977 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
978 (defun semantic-lex-token-with-text-p (thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
979 "Return non-nil if THING is a semantic lex token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
980 This is an exhaustively robust check." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
981 (and (consp thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
982 (symbolp (car thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
983 (= (length thing) 4) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
984 (stringp (nth 1 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
985 (numberp (nth 2 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
986 (numberp (nth 3 thing))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
987 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
988 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
989 (defun semantic-lex-token-without-text-p (thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
990 "Return non-nil if THING is a semantic lex token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
991 This is an exhaustively robust check." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
992 (and (consp thing) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
993 (symbolp (car thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
994 (= (length thing) 3) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
995 (numberp (nth 1 thing)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
996 (numberp (nth 2 thing))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
997 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
998 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
999 (defun semantic-lex-expand-block-specs (specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1000 "Expand block specifications SPECS into a Lisp form. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1001 SPECS is a list of (BLOCK BEGIN END) elements where BLOCK, BEGIN, and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1002 END are token class symbols that indicate to produce one collapsed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1003 BLOCK token from tokens found between BEGIN and END ones. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1004 BLOCK must be a non-nil symbol, and at least one of the BEGIN or END |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1005 symbols must be non-nil too. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1006 When BEGIN is non-nil, generate a call to `semantic-lex-start-block' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1007 when a BEGIN token class is encountered. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1008 When END is non-nil, generate a call to `semantic-lex-end-block' when |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1009 an END token class is encountered." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1010 (let ((class (make-symbol "class")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1011 (form nil)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1012 (dolist (spec specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1013 (when (car spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1014 (when (nth 1 spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1015 (push `((eq ',(nth 1 spec) ,class) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1016 (semantic-lex-start-block ',(car spec))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1017 form)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1018 (when (nth 2 spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1019 (push `((eq ',(nth 2 spec) ,class) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1020 (semantic-lex-end-block ',(car spec))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1021 form)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1022 (when form |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1023 `((let ((,class (semantic-lex-token-class |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1024 (car semantic-lex-token-stream)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1025 (cond ,@(nreverse form)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1026 ))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1027 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1028 (defmacro semantic-lex-push-token (token &rest blockspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1029 "Push TOKEN in the lexical analyzer token stream. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1030 Return the lexical analysis current end point. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1031 If optional arguments BLOCKSPECS is non-nil, it specifies to process |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1032 collapsed block tokens. See `semantic-lex-expand-block-specs' for |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1033 more details. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1034 This macro should only be called within the bounds of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1035 `define-lex-analyzer'. It changes the values of the lexical analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1036 variables `token-stream' and `semantic-lex-end-point'. If you need to |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1037 move `semantic-lex-end-point' somewhere else, just modify this |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1038 variable after calling `semantic-lex-push-token'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1039 `(progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1040 (push ,token semantic-lex-token-stream) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1041 ,@(semantic-lex-expand-block-specs blockspecs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1042 (setq semantic-lex-end-point |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1043 (semantic-lex-token-end (car semantic-lex-token-stream))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1044 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1045 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1046 (defsubst semantic-lex-token-class (token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1047 "Fetch the class of the lexical token TOKEN. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1048 See also the function `semantic-lex-token'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1049 (car token)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1050 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1051 (defsubst semantic-lex-token-text (token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1052 "Fetch the text associated with the lexical token TOKEN. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1053 See also the function `semantic-lex-token'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1054 (if (stringp (car (cdr token))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1055 (car (cdr token)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1056 (buffer-substring-no-properties |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1057 (semantic-lex-token-start token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1058 (semantic-lex-token-end token)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1059 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1060 (defun semantic-lex-init () |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1061 "Initialize any lexical state for this buffer." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1062 (unless semantic-lex-comment-regex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1063 (setq semantic-lex-comment-regex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1064 (if comment-start-skip |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1065 (concat "\\(\\s<\\|" comment-start-skip "\\)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1066 "\\(\\s<\\)"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1067 ;; Setup the lexer syntax-table |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1068 (setq semantic-lex-syntax-table (copy-syntax-table (syntax-table))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1069 (dolist (mod semantic-lex-syntax-modifications) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1070 (modify-syntax-entry |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1071 (car mod) (nth 1 mod) semantic-lex-syntax-table))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1072 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1073 (define-overloadable-function semantic-lex (start end &optional depth length) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1074 "Lexically analyze text in the current buffer between START and END. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1075 Optional argument DEPTH indicates at what level to scan over entire |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1076 lists. The last argument, LENGTH specifies that `semantic-lex' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1077 should only return LENGTH tokens. The return value is a token stream. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1078 Each element is a list, such of the form |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1079 (symbol start-expression . end-expression) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1080 where SYMBOL denotes the token type. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1081 See `semantic-lex-tokens' variable for details on token types. END |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1082 does not mark the end of the text scanned, only the end of the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1083 beginning of text scanned. Thus, if a string extends past END, the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1084 end of the return token will be larger than END. To truly restrict |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1085 scanning, use `narrow-to-region'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1086 (funcall semantic-lex-analyzer start end depth length)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1087 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1088 (defsubst semantic-lex-buffer (&optional depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1089 "Lex the current buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1090 Optional argument DEPTH is the depth to scan into lists." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1091 (semantic-lex (point-min) (point-max) depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1092 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1093 (defsubst semantic-lex-list (semlist depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1094 "Lex the body of SEMLIST to DEPTH." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1095 (semantic-lex (semantic-lex-token-start semlist) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1096 (semantic-lex-token-end semlist) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1097 depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1098 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1099 ;;; Analyzer creation macros |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1100 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1101 ;; An individual analyzer is a condition and code that goes with it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1102 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1103 ;; Created analyzers become variables with the code associated with them |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1104 ;; as the symbol value. These analyzers are assembled into a lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1105 ;; to create new lexical analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1106 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1107 (defcustom semantic-lex-debug-analyzers nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1108 "Non nil means to debug analyzers with syntax protection. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1109 Only in effect if `debug-on-error' is also non-nil." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1110 :group 'semantic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1111 :type 'boolean) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1112 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1113 (defmacro semantic-lex-unterminated-syntax-protection (syntax &rest forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1114 "For SYNTAX, execute FORMS with protection for unterminated syntax. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1115 If FORMS throws an error, treat this as a syntax problem, and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1116 execute the unterminated syntax code. FORMS should return a position. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1117 Irreguardless of an error, the cursor should be moved to the end of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1118 the desired syntax, and a position returned. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1119 If `debug-on-error' is set, errors are not caught, so that you can |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1120 debug them. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1121 Avoid using a large FORMS since it is duplicated." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1122 `(if (and debug-on-error semantic-lex-debug-analyzers) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1123 (progn ,@forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1124 (condition-case nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1125 (progn ,@forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1126 (error |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1127 (semantic-lex-unterminated-syntax-detected ,syntax))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1128 (put 'semantic-lex-unterminated-syntax-protection |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1129 'lisp-indent-function 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1130 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1131 (defmacro define-lex-analyzer (name doc condition &rest forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1132 "Create a single lexical analyzer NAME with DOC. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1133 When an analyzer is called, the current buffer and point are |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1134 positioned in a buffer at the location to be analyzed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1135 CONDITION is an expression which returns t if FORMS should be run. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1136 Within the bounds of CONDITION and FORMS, the use of backquote |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1137 can be used to evaluate expressions at compile time. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1138 While forms are running, the following variables will be locally bound: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1139 `semantic-lex-analysis-bounds' - The bounds of the current analysis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1140 of the form (START . END) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1141 `semantic-lex-maximum-depth' - The maximum depth of semantic-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1142 for the current analysis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1143 `semantic-lex-current-depth' - The current depth of `semantic-list' that has |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1144 been decended. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1145 `semantic-lex-end-point' - End Point after match. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1146 Analyzers should set this to a buffer location if their |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1147 match string does not represent the end of the matched text. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1148 `semantic-lex-token-stream' - The token list being collected. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1149 Add new lexical tokens to this list. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1150 Proper action in FORMS is to move the value of `semantic-lex-end-point' to |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1151 after the location of the analyzed entry, and to add any discovered tokens |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1152 at the beginning of `semantic-lex-token-stream'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1153 This can be done by using `semantic-lex-push-token'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1154 `(eval-and-compile |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1155 (defvar ,name nil ,doc) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1156 (defun ,name nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1157 ;; Do this part separately so that re-evaluation rebuilds this code. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1158 (setq ,name '(,condition ,@forms)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1159 ;; Build a single lexical analyzer function, so the doc for |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1160 ;; function help is automatically provided, and perhaps the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1161 ;; function could be useful for testing and debugging one |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1162 ;; analyzer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1163 (fset ',name (lambda () ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1164 (let ((semantic-lex-token-stream nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1165 (semantic-lex-end-point (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1166 (semantic-lex-analysis-bounds |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1167 (cons (point) (point-max))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1168 (semantic-lex-current-depth 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1169 (semantic-lex-maximum-depth |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1170 semantic-lex-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1171 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1172 (when ,condition ,@forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1173 semantic-lex-token-stream))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1174 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1175 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1176 (defmacro define-lex-regex-analyzer (name doc regexp &rest forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1177 "Create a lexical analyzer with NAME and DOC that will match REGEXP. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1178 FORMS are evaluated upon a successful match. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1179 See `define-lex-analyzer' for more about analyzers." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1180 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1181 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1182 (looking-at ,regexp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1183 ,@forms |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1184 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1185 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1186 (defmacro define-lex-simple-regex-analyzer (name doc regexp toksym |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1187 &optional index |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1188 &rest forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1189 "Create a lexical analyzer with NAME and DOC that match REGEXP. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1190 TOKSYM is the symbol to use when creating a semantic lexical token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1191 INDEX is the index into the match that defines the bounds of the token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1192 Index should be a plain integer, and not specified in the macro as an |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1193 expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1194 FORMS are evaluated upon a successful match BEFORE the new token is |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1195 created. It is valid to ignore FORMS. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1196 See `define-lex-analyzer' for more about analyzers." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1197 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1198 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1199 (looking-at ,regexp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1200 ,@forms |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1201 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1202 (semantic-lex-token ,toksym |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1203 (match-beginning ,(or index 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1204 (match-end ,(or index 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1205 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1206 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1207 (defmacro define-lex-block-analyzer (name doc spec1 &rest specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1208 "Create a lexical analyzer NAME for paired delimiters blocks. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1209 It detects a paired delimiters block or the corresponding open or |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1210 close delimiter depending on the value of the variable |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1211 `semantic-lex-current-depth'. DOC is the documentation string of the lexical |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1212 analyzer. SPEC1 and SPECS specify the token symbols and open, close |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1213 delimiters used. Each SPEC has the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1214 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1215 \(BLOCK-SYM (OPEN-DELIM OPEN-SYM) (CLOSE-DELIM CLOSE-SYM)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1216 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1217 where BLOCK-SYM is the symbol returned in a block token. OPEN-DELIM |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1218 and CLOSE-DELIM are respectively the open and close delimiters |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1219 identifying a block. OPEN-SYM and CLOSE-SYM are respectively the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1220 symbols returned in open and close tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1221 (let ((specs (cons spec1 specs)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1222 spec open olist clist) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1223 (while specs |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1224 (setq spec (car specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1225 specs (cdr specs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1226 open (nth 1 spec) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1227 ;; build alist ((OPEN-DELIM OPEN-SYM BLOCK-SYM) ...) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1228 olist (cons (list (car open) (cadr open) (car spec)) olist) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1229 ;; build alist ((CLOSE-DELIM CLOSE-SYM) ...) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1230 clist (cons (nth 2 spec) clist))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1231 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1232 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1233 (and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1234 (looking-at "\\(\\s(\\|\\s)\\)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1235 (let ((text (match-string 0)) match) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1236 (cond |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1237 ((setq match (assoc text ',olist)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1238 (if (or (not semantic-lex-maximum-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1239 (< semantic-lex-current-depth semantic-lex-maximum-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1240 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1241 (setq semantic-lex-current-depth (1+ semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1242 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1243 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1244 (nth 1 match) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1245 (match-beginning 0) (match-end 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1246 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1247 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1248 (nth 2 match) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1249 (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1250 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1251 (semantic-lex-unterminated-syntax-protection (nth 2 match) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1252 (forward-list 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1253 (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1254 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1255 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1256 ((setq match (assoc text ',clist)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1257 (setq semantic-lex-current-depth (1- semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1258 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1259 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1260 (nth 1 match) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1261 (match-beginning 0) (match-end 0))))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1262 ))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1263 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1264 ;;; Analyzers |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1265 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1266 ;; Pre-defined common analyzers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1267 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1268 (define-lex-analyzer semantic-lex-default-action |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1269 "The default action when no other lexical actions match text. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1270 This action will just throw an error." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1271 t |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1272 (error "Unmatched Text during Lexical Analysis")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1273 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1274 (define-lex-analyzer semantic-lex-beginning-of-line |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1275 "Detect and create a beginning of line token (BOL)." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1276 (and (bolp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1277 ;; Just insert a (bol N . N) token in the token stream, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1278 ;; without moving the point. N is the point at the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1279 ;; beginning of line. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1280 (semantic-lex-push-token (semantic-lex-token 'bol (point) (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1281 nil) ;; CONTINUE |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1282 ;; We identify and add the BOL token onto the stream, but since |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1283 ;; semantic-lex-end-point doesn't move, we always fail CONDITION, and have no |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1284 ;; FORMS body. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1285 nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1286 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1287 (define-lex-simple-regex-analyzer semantic-lex-newline |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1288 "Detect and create newline tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1289 "\\s-*\\(\n\\|\\s>\\)" 'newline 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1290 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1291 (define-lex-regex-analyzer semantic-lex-newline-as-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1292 "Detect and create newline tokens. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1293 Use this ONLY if newlines are not whitespace characters (such as when |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1294 they are comment end characters) AND when you want whitespace tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1295 "\\s-*\\(\n\\|\\s>\\)" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1296 ;; Language wants whitespaces. Create a token for it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1297 (if (eq (semantic-lex-token-class (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1298 'whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1299 ;; Merge whitespace tokens together if they are adjacent. Two |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1300 ;; whitespace tokens may be sperated by a comment which is not in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1301 ;; the token stream. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1302 (setcdr (semantic-lex-token-bounds (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1303 (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1304 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1305 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1306 'whitespace (match-beginning 0) (match-end 0))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1307 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1308 (define-lex-regex-analyzer semantic-lex-ignore-newline |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1309 "Detect and ignore newline tokens. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1310 Use this ONLY if newlines are not whitespace characters (such as when |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1311 they are comment end characters)." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1312 "\\s-*\\(\n\\|\\s>\\)" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1313 (setq semantic-lex-end-point (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1314 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1315 (define-lex-regex-analyzer semantic-lex-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1316 "Detect and create whitespace tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1317 ;; catch whitespace when needed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1318 "\\s-+" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1319 ;; Language wants whitespaces. Create a token for it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1320 (if (eq (semantic-lex-token-class (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1321 'whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1322 ;; Merge whitespace tokens together if they are adjacent. Two |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1323 ;; whitespace tokens may be sperated by a comment which is not in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1324 ;; the token stream. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1325 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1326 (setq semantic-lex-end-point (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1327 (setcdr (semantic-lex-token-bounds (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1328 semantic-lex-end-point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1329 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1330 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1331 'whitespace (match-beginning 0) (match-end 0))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1332 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1333 (define-lex-regex-analyzer semantic-lex-ignore-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1334 "Detect and skip over whitespace tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1335 ;; catch whitespace when needed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1336 "\\s-+" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1337 ;; Skip over the detected whitespace, do not create a token for it. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1338 (setq semantic-lex-end-point (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1339 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1340 (define-lex-simple-regex-analyzer semantic-lex-number |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1341 "Detect and create number tokens. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1342 See `semantic-lex-number-expression' for details on matching numbers, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1343 and number formats." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1344 semantic-lex-number-expression 'number) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1345 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1346 (define-lex-regex-analyzer semantic-lex-symbol-or-keyword |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1347 "Detect and create symbol and keyword tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1348 "\\(\\sw\\|\\s_\\)+" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1349 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1350 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1351 (or (semantic-lex-keyword-p (match-string 0)) 'symbol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1352 (match-beginning 0) (match-end 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1353 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1354 (define-lex-simple-regex-analyzer semantic-lex-charquote |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1355 "Detect and create charquote tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1356 ;; Character quoting characters (ie, \n as newline) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1357 "\\s\\+" 'charquote) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1358 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1359 (define-lex-simple-regex-analyzer semantic-lex-punctuation |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1360 "Detect and create punctuation tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1361 "\\(\\s.\\|\\s$\\|\\s'\\)" 'punctuation) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1362 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1363 (define-lex-analyzer semantic-lex-punctuation-type |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1364 "Detect and create a punctuation type token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1365 Recognized punctuations are defined in the current table of lexical |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1366 types, as the value of the `punctuation' token type." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1367 (and (looking-at "\\(\\s.\\|\\s$\\|\\s'\\)+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1368 (let* ((key (match-string 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1369 (pos (match-beginning 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1370 (end (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1371 (len (- end pos)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1372 (lst (semantic-lex-type-value "punctuation" t)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1373 (def (car lst)) ;; default lexical symbol or nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1374 (lst (cdr lst)) ;; alist of (LEX-SYM . PUNCT-STRING) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1375 (elt nil)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1376 (if lst |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1377 ;; Starting with the longest one, search if the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1378 ;; punctuation string is defined for this language. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1379 (while (and (> len 0) (not (setq elt (rassoc key lst)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1380 (setq len (1- len) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1381 key (substring key 0 len)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1382 (if elt ;; Return the punctuation token found |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1383 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1384 (semantic-lex-token (car elt) pos (+ pos len))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1385 (if def ;; Return a default generic token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1386 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1387 (semantic-lex-token def pos end)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1388 ;; Nothing match |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1389 ))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1390 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1391 (define-lex-regex-analyzer semantic-lex-paren-or-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1392 "Detect open parenthesis. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1393 Return either a paren token or a semantic list token depending on |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1394 `semantic-lex-current-depth'." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1395 "\\s(" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1396 (if (or (not semantic-lex-maximum-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1397 (< semantic-lex-current-depth semantic-lex-maximum-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1398 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1399 (setq semantic-lex-current-depth (1+ semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1400 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1401 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1402 'open-paren (match-beginning 0) (match-end 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1403 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1404 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1405 'semantic-list (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1406 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1407 (semantic-lex-unterminated-syntax-protection 'semantic-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1408 (forward-list 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1409 (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1410 ))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1411 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1412 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1413 (define-lex-simple-regex-analyzer semantic-lex-open-paren |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1414 "Detect and create an open parenthisis token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1415 "\\s(" 'open-paren 0 (setq semantic-lex-current-depth (1+ semantic-lex-current-depth))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1416 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1417 (define-lex-simple-regex-analyzer semantic-lex-close-paren |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1418 "Detect and create a close paren token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1419 "\\s)" 'close-paren 0 (setq semantic-lex-current-depth (1- semantic-lex-current-depth))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1420 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1421 (define-lex-regex-analyzer semantic-lex-string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1422 "Detect and create a string token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1423 "\\s\"" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1424 ;; Zing to the end of this string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1425 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1426 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1427 'string (point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1428 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1429 (semantic-lex-unterminated-syntax-protection 'string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1430 (forward-sexp 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1431 (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1432 )))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1433 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1434 (define-lex-regex-analyzer semantic-lex-comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1435 "Detect and create a comment token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1436 semantic-lex-comment-regex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1437 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1438 (forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1439 ;; Generate newline token if enabled |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1440 (if (bolp) (backward-char 1)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1441 (setq semantic-lex-end-point (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1442 ;; Language wants comments or want them as whitespaces, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1443 ;; link them together. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1444 (if (eq (semantic-lex-token-class (car semantic-lex-token-stream)) 'comment) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1445 (setcdr (semantic-lex-token-bounds (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1446 semantic-lex-end-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1447 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1448 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1449 'comment (match-beginning 0) semantic-lex-end-point))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1450 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1451 (define-lex-regex-analyzer semantic-lex-comments-as-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1452 "Detect comments and create a whitespace token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1453 semantic-lex-comment-regex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1454 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1455 (forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1456 ;; Generate newline token if enabled |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1457 (if (bolp) (backward-char 1)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1458 (setq semantic-lex-end-point (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1459 ;; Language wants comments or want them as whitespaces, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1460 ;; link them together. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1461 (if (eq (semantic-lex-token-class (car semantic-lex-token-stream)) 'whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1462 (setcdr (semantic-lex-token-bounds (car semantic-lex-token-stream)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1463 semantic-lex-end-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1464 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1465 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1466 'whitespace (match-beginning 0) semantic-lex-end-point))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1467 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1468 (define-lex-regex-analyzer semantic-lex-ignore-comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1469 "Detect and create a comment token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1470 semantic-lex-comment-regex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1471 (let ((comment-start-point (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1472 (forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1473 (if (eq (point) comment-start-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1474 ;; In this case our start-skip string failed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1475 ;; to work properly. Lets try and move over |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1476 ;; whatever white space we matched to begin |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1477 ;; with. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1478 (skip-syntax-forward "-.'" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1479 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1480 (end-of-line) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1481 (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1482 ;; We may need to back up so newlines or whitespace is generated. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1483 (if (bolp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1484 (backward-char 1))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1485 (if (eq (point) comment-start-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1486 (error "Strange comment syntax prevents lexical analysis")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1487 (setq semantic-lex-end-point (point)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1488 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1489 ;;; Comment lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1490 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1491 ;; Predefined lexers that could be used instead of creating new |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1492 ;; analyers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1493 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1494 (define-lex semantic-comment-lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1495 "A simple lexical analyzer that handles comments. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1496 This lexer will only return comment tokens. It is the default lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1497 used by `semantic-find-doc-snarf-comment' to snarf up the comment at |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1498 point." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1499 semantic-lex-ignore-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1500 semantic-lex-ignore-newline |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1501 semantic-lex-comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1502 semantic-lex-default-action) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1503 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1504 ;;; Test Lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1505 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1506 (define-lex semantic-simple-lexer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1507 "A simple lexical analyzer that handles simple buffers. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1508 This lexer ignores comments and whitespace, and will return |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1509 syntax as specified by the syntax table." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1510 semantic-lex-ignore-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1511 semantic-lex-ignore-newline |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1512 semantic-lex-number |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1513 semantic-lex-symbol-or-keyword |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1514 semantic-lex-charquote |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1515 semantic-lex-paren-or-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1516 semantic-lex-close-paren |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1517 semantic-lex-string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1518 semantic-lex-ignore-comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1519 semantic-lex-punctuation |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1520 semantic-lex-default-action) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1521 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1522 ;;; Analyzers generated from grammar. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1523 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1524 ;; Some analyzers are hand written. Analyzers created with these |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1525 ;; functions are generated from the grammar files. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1526 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1527 (defmacro define-lex-keyword-type-analyzer (name doc syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1528 "Define a keyword type analyzer NAME with DOC string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1529 SYNTAX is the regexp that matches a keyword syntactic expression." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1530 (let ((key (make-symbol "key"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1531 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1532 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1533 (and (looking-at ,syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1534 (let ((,key (semantic-lex-keyword-p (match-string 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1535 (when ,key |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1536 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1537 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1538 ,key (match-beginning 0) (match-end 0))))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1539 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1540 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1541 (defmacro define-lex-sexp-type-analyzer (name doc syntax token) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1542 "Define a sexp type analyzer NAME with DOC string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1543 SYNTAX is the regexp that matches the beginning of the s-expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1544 TOKEN is the lexical token returned when SYNTAX matches." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1545 `(define-lex-regex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1546 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1547 ,syntax |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1548 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1549 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1550 ,token (point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1551 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1552 (semantic-lex-unterminated-syntax-protection ,token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1553 (forward-sexp 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1554 (point)))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1555 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1556 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1557 (defmacro define-lex-regex-type-analyzer (name doc syntax matches default) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1558 "Define a regexp type analyzer NAME with DOC string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1559 SYNTAX is the regexp that matches a syntactic expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1560 MATCHES is an alist of lexical elements used to refine the syntactic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1561 expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1562 DEFAULT is the default lexical token returned when no MATCHES." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1563 (if matches |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1564 (let* ((val (make-symbol "val")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1565 (lst (make-symbol "lst")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1566 (elt (make-symbol "elt")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1567 (pos (make-symbol "pos")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1568 (end (make-symbol "end"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1569 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1570 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1571 (and (looking-at ,syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1572 (let* ((,val (match-string 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1573 (,pos (match-beginning 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1574 (,end (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1575 (,lst ,matches) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1576 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1577 (while (and ,lst (not ,elt)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1578 (if (string-match (cdar ,lst) ,val) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1579 (setq ,elt (caar ,lst)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1580 (setq ,lst (cdr ,lst)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1581 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1582 (semantic-lex-token (or ,elt ,default) ,pos ,end)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1583 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1584 `(define-lex-simple-regex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1585 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1586 ,syntax ,default) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1587 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1588 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1589 (defmacro define-lex-string-type-analyzer (name doc syntax matches default) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1590 "Define a string type analyzer NAME with DOC string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1591 SYNTAX is the regexp that matches a syntactic expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1592 MATCHES is an alist of lexical elements used to refine the syntactic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1593 expression. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1594 DEFAULT is the default lexical token returned when no MATCHES." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1595 (if matches |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1596 (let* ((val (make-symbol "val")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1597 (lst (make-symbol "lst")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1598 (elt (make-symbol "elt")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1599 (pos (make-symbol "pos")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1600 (end (make-symbol "end")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1601 (len (make-symbol "len"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1602 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1603 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1604 (and (looking-at ,syntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1605 (let* ((,val (match-string 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1606 (,pos (match-beginning 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1607 (,end (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1608 (,len (- ,end ,pos)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1609 (,lst ,matches) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1610 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1611 ;; Starting with the longest one, search if a lexical |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1612 ;; value match a token defined for this language. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1613 (while (and (> ,len 0) (not (setq ,elt (rassoc ,val ,lst)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1614 (setq ,len (1- ,len) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1615 ,val (substring ,val 0 ,len))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1616 (when ,elt ;; Adjust token end position. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1617 (setq ,elt (car ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1618 ,end (+ ,pos ,len))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1619 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1620 (semantic-lex-token (or ,elt ,default) ,pos ,end)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1621 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1622 `(define-lex-simple-regex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1623 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1624 ,syntax ,default) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1625 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1626 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1627 (defmacro define-lex-block-type-analyzer (name doc syntax matches) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1628 "Define a block type analyzer NAME with DOC string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1629 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1630 SYNTAX is the regexp that matches block delimiters, typically the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1631 open (`\\\\s(') and close (`\\\\s)') parenthesis syntax classes. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1632 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1633 MATCHES is a pair (OPEN-SPECS . CLOSE-SPECS) that defines blocks. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1634 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1635 OPEN-SPECS is a list of (OPEN-DELIM OPEN-TOKEN BLOCK-TOKEN) elements |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1636 where: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1637 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1638 OPEN-DELIM is a string: the block open delimiter character. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1639 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1640 OPEN-TOKEN is the lexical token class associated to the OPEN-DELIM |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1641 delimiter. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1642 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1643 BLOCK-TOKEN is the lexical token class associated to the block |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1644 that starts at the OPEN-DELIM delimiter. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1645 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1646 CLOSE-SPECS is a list of (CLOSE-DELIM CLOSE-TOKEN) elements where: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1647 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1648 CLOSE-DELIM is a string: the block end delimiter character. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1649 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1650 CLOSE-TOKEN is the lexical token class associated to the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1651 CLOSE-DELIM delimiter. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1652 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1653 Each element in OPEN-SPECS must have a corresponding element in |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1654 CLOSE-SPECS. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1655 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1656 The lexer will return a BLOCK-TOKEN token when the value of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1657 `semantic-lex-current-depth' is greater than or equal to the maximum |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1658 depth of parenthesis tracking (see also the function `semantic-lex'). |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1659 Otherwise it will return OPEN-TOKEN and CLOSE-TOKEN tokens. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1660 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1661 TO DO: Put the following in the developer's guide and just put a |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1662 reference here. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1663 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1664 In the grammar: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1665 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1666 The value of a block token must be a string that contains a readable |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1667 sexp of the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1668 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1669 \"(OPEN-TOKEN CLOSE-TOKEN)\" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1670 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1671 OPEN-TOKEN and CLOSE-TOKEN represent the block delimiters, and must be |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1672 lexical tokens of respectively `open-paren' and `close-paren' types. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1673 Their value is the corresponding delimiter character as a string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1674 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1675 Here is a small example to analyze a parenthesis block: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1676 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1677 %token <block> PAREN_BLOCK \"(LPAREN RPAREN)\" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1678 %token <open-paren> LPAREN \"(\" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1679 %token <close-paren> RPAREN \")\" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1680 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1681 When the lexer encounters the open-paren delimiter \"(\": |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1682 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1683 - If the maximum depth of parenthesis tracking is not reached (that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1684 is, current depth < max depth), it returns a (LPAREN start . end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1685 token, then continue analysis inside the block. Later, when the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1686 corresponding close-paren delimiter \")\" will be encountered, it |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1687 will return a (RPAREN start . end) token. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1688 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1689 - If the maximum depth of parenthesis tracking is reached (current |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1690 depth >= max depth), it returns the whole parenthesis block as |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1691 a (PAREN_BLOCK start . end) token." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1692 (let* ((val (make-symbol "val")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1693 (lst (make-symbol "lst")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1694 (elt (make-symbol "elt"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1695 `(define-lex-analyzer ,name |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1696 ,doc |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1697 (and |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1698 (looking-at ,syntax) ;; "\\(\\s(\\|\\s)\\)" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1699 (let ((,val (match-string 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1700 (,lst ,matches) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1701 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1702 (cond |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1703 ((setq ,elt (assoc ,val (car ,lst))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1704 (if (or (not semantic-lex-maximum-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1705 (< semantic-lex-current-depth semantic-lex-maximum-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1706 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1707 (setq semantic-lex-current-depth (1+ semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1708 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1709 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1710 (nth 1 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1711 (match-beginning 0) (match-end 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1712 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1713 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1714 (nth 2 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1715 (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1716 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1717 (semantic-lex-unterminated-syntax-protection (nth 2 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1718 (forward-list 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1719 (point))))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1720 ((setq ,elt (assoc ,val (cdr ,lst))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1721 (setq semantic-lex-current-depth (1- semantic-lex-current-depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1722 (semantic-lex-push-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1723 (semantic-lex-token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1724 (nth 1 ,elt) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1725 (match-beginning 0) (match-end 0)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1726 )))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1727 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1728 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1729 ;;; Lexical Safety |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1730 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1731 ;; The semantic lexers, unlike other lexers, can throw errors on |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1732 ;; unbalanced syntax. Since editing is all about changeging test |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1733 ;; we need to provide a convenient way to protect against syntactic |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1734 ;; inequalities. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1735 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1736 (defmacro semantic-lex-catch-errors (symbol &rest forms) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1737 "Using SYMBOL, execute FORMS catching lexical errors. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1738 If FORMS results in a call to the parser that throws a lexical error, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1739 the error will be caught here without the buffer's cache being thrown |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1740 out of date. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1741 If there is an error, the syntax that failed is returned. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1742 If there is no error, then the last value of FORMS is returned." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1743 (let ((ret (make-symbol "ret")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1744 (syntax (make-symbol "syntax")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1745 (start (make-symbol "start")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1746 (end (make-symbol "end"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1747 `(let* ((semantic-lex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1748 (lambda (,syntax ,start ,end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1749 (throw ',symbol ,syntax))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1750 ;; Delete the below when semantic-flex is fully retired. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1751 (semantic-flex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1752 semantic-lex-unterminated-syntax-end-function) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1753 (,ret (catch ',symbol |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1754 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1755 ,@forms |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1756 nil)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1757 ;; Great Sadness. Assume that FORMS execute within the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1758 ;; confines of the current buffer only! Mark this thing |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1759 ;; unparseable iff the special symbol was thrown. This |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1760 ;; will prevent future calls from parsing, but will allow |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1761 ;; then to still return the cache. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1762 (when ,ret |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1763 ;; Leave this message off. If an APP using this fcn wants |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1764 ;; a message, they can do it themselves. This cleans up |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1765 ;; problems with the idle scheduler obscuring useful data. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1766 ;;(message "Buffer not currently parsable (%S)." ,ret) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1767 (semantic-parse-tree-unparseable)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1768 ,ret))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1769 (put 'semantic-lex-catch-errors 'lisp-indent-function 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1770 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1771 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1772 ;;; Interfacing with edebug |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1773 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1774 (add-hook |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1775 'edebug-setup-hook |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1776 #'(lambda () |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1777 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1778 (def-edebug-spec define-lex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1779 (&define name stringp (&rest symbolp)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1780 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1781 (def-edebug-spec define-lex-analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1782 (&define name stringp form def-body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1783 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1784 (def-edebug-spec define-lex-regex-analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1785 (&define name stringp form def-body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1786 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1787 (def-edebug-spec define-lex-simple-regex-analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1788 (&define name stringp form symbolp [ &optional form ] def-body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1789 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1790 (def-edebug-spec define-lex-block-analyzer |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1791 (&define name stringp form (&rest form)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1792 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1793 (def-edebug-spec semantic-lex-catch-errors |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1794 (symbolp def-body) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1795 ) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1796 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1797 )) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1798 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1799 ;;; Compatibility with Semantic 1.x lexical analysis |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1800 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1801 ;; NOTE: DELETE THIS SOMEDAY SOON |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1802 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1803 (semantic-alias-obsolete 'semantic-flex-start 'semantic-lex-token-start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1804 (semantic-alias-obsolete 'semantic-flex-end 'semantic-lex-token-end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1805 (semantic-alias-obsolete 'semantic-flex-text 'semantic-lex-token-text) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1806 (semantic-alias-obsolete 'semantic-flex-make-keyword-table 'semantic-lex-make-keyword-table) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1807 (semantic-alias-obsolete 'semantic-flex-keyword-p 'semantic-lex-keyword-p) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1808 (semantic-alias-obsolete 'semantic-flex-keyword-put 'semantic-lex-keyword-put) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1809 (semantic-alias-obsolete 'semantic-flex-keyword-get 'semantic-lex-keyword-get) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1810 (semantic-alias-obsolete 'semantic-flex-map-keywords 'semantic-lex-map-keywords) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1811 (semantic-alias-obsolete 'semantic-flex-keywords 'semantic-lex-keywords) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1812 (semantic-alias-obsolete 'semantic-flex-buffer 'semantic-lex-buffer) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1813 (semantic-alias-obsolete 'semantic-flex-list 'semantic-lex-list) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1814 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1815 ;; This simple scanner uses the syntax table to generate a stream of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1816 ;; simple tokens of the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1817 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1818 ;; (SYMBOL START . END) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1819 ;; |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1820 ;; Where symbol is the type of thing it is. START and END mark that |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1821 ;; objects boundary. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1822 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1823 (defvar semantic-flex-tokens semantic-lex-tokens |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1824 "An alist of of semantic token types. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1825 See variable `semantic-lex-tokens'.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1826 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1827 (defvar semantic-flex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1828 (lambda (syntax syntax-start flex-end) flex-end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1829 "Function called when unterminated syntax is encountered. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1830 This should be set to one function. That function should take three |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1831 parameters. The SYNTAX, or type of syntax which is unterminated. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1832 SYNTAX-START where the broken syntax begins. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1833 FLEX-END is where the lexical analysis was asked to end. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1834 This function can be used for languages that can intelligently fix up |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1835 broken syntax, or the exit lexical analysis via `throw' or `signal' |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1836 when finding unterminated syntax.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1837 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1838 (defvar semantic-flex-extensions nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1839 "Buffer local extensions to the lexical analyzer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1840 This should contain an alist with a key of a regex and a data element of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1841 a function. The function should both move point, and return a lexical |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1842 token of the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1843 ( TYPE START . END) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1844 nil is also a valid return value. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1845 TYPE can be any type of symbol, as long as it doesn't occur as a |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1846 nonterminal in the language definition.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1847 (make-variable-buffer-local 'semantic-flex-extensions) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1848 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1849 (defvar semantic-flex-syntax-modifications nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1850 "Changes to the syntax table for this buffer. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1851 These changes are active only while the buffer is being flexed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1852 This is a list where each element has the form: |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1853 (CHAR CLASS) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1854 CHAR is the char passed to `modify-syntax-entry', |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1855 and CLASS is the string also passed to `modify-syntax-entry' to define |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1856 what syntax class CHAR has.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1857 (make-variable-buffer-local 'semantic-flex-syntax-modifications) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1858 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1859 (defvar semantic-ignore-comments t |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1860 "Default comment handling. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1861 t means to strip comments when flexing. Nil means to keep comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1862 as part of the token stream.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1863 (make-variable-buffer-local 'semantic-ignore-comments) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1864 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1865 (defvar semantic-flex-enable-newlines nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1866 "When flexing, report 'newlines as syntactic elements. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1867 Useful for languages where the newline is a special case terminator. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1868 Only set this on a per mode basis, not globally.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1869 (make-variable-buffer-local 'semantic-flex-enable-newlines) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1870 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1871 (defvar semantic-flex-enable-whitespace nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1872 "When flexing, report 'whitespace as syntactic elements. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1873 Useful for languages where the syntax is whitespace dependent. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1874 Only set this on a per mode basis, not globally.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1875 (make-variable-buffer-local 'semantic-flex-enable-whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1876 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1877 (defvar semantic-flex-enable-bol nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1878 "When flexing, report beginning of lines as syntactic elements. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1879 Useful for languages like python which are indentation sensitive. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1880 Only set this on a per mode basis, not globally.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1881 (make-variable-buffer-local 'semantic-flex-enable-bol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1882 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1883 (defvar semantic-number-expression semantic-lex-number-expression |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1884 "See variable `semantic-lex-number-expression'.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1885 (make-variable-buffer-local 'semantic-number-expression) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1886 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1887 (defvar semantic-flex-depth 0 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1888 "Default flexing depth. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1889 This specifies how many lists to create tokens in.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1890 (make-variable-buffer-local 'semantic-flex-depth) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1891 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1892 (defun semantic-flex (start end &optional depth length) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1893 "Using the syntax table, do something roughly equivalent to flex. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1894 Semantically check between START and END. Optional argument DEPTH |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1895 indicates at what level to scan over entire lists. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1896 The return value is a token stream. Each element is a list, such of |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1897 the form (symbol start-expression . end-expression) where SYMBOL |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1898 denotes the token type. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1899 See `semantic-flex-tokens' variable for details on token types. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1900 END does not mark the end of the text scanned, only the end of the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1901 beginning of text scanned. Thus, if a string extends past END, the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1902 end of the return token will be larger than END. To truly restrict |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1903 scanning, use `narrow-to-region'. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1904 The last argument, LENGTH specifies that `semantic-flex' should only |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1905 return LENGTH tokens." |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1906 (message "`semantic-flex' is an obsolete function. Use `define-lex' to create lexers.") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1907 (if (not semantic-flex-keywords-obarray) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1908 (setq semantic-flex-keywords-obarray [ nil ])) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1909 (let ((ts nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1910 (pos (point)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1911 (ep nil) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1912 (curdepth 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1913 (cs (if comment-start-skip |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1914 (concat "\\(\\s<\\|" comment-start-skip "\\)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1915 (concat "\\(\\s<\\)"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1916 (newsyntax (copy-syntax-table (syntax-table))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1917 (mods semantic-flex-syntax-modifications) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1918 ;; Use the default depth if it is not specified. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1919 (depth (or depth semantic-flex-depth))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1920 ;; Update the syntax table |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1921 (while mods |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1922 (modify-syntax-entry (car (car mods)) (car (cdr (car mods))) newsyntax) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1923 (setq mods (cdr mods))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1924 (with-syntax-table newsyntax |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1925 (goto-char start) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1926 (while (and (< (point) end) (or (not length) (<= (length ts) length))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1927 (cond |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1928 ;; catch beginning of lines when needed. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1929 ;; Must be done before catching any other tokens! |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1930 ((and semantic-flex-enable-bol |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1931 (bolp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1932 ;; Just insert a (bol N . N) token in the token stream, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1933 ;; without moving the point. N is the point at the |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1934 ;; beginning of line. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1935 (setq ts (cons (cons 'bol (cons (point) (point))) ts)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1936 nil)) ;; CONTINUE |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1937 ;; special extensions, includes whitespace, nl, etc. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1938 ((and semantic-flex-extensions |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1939 (let ((fe semantic-flex-extensions) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1940 (r nil)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1941 (while fe |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1942 (if (looking-at (car (car fe))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1943 (setq ts (cons (funcall (cdr (car fe))) ts) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1944 r t |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1945 fe nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1946 ep (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1947 (setq fe (cdr fe))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1948 (if (and r (not (car ts))) (setq ts (cdr ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1949 r))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1950 ;; catch newlines when needed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1951 ((looking-at "\\s-*\\(\n\\|\\s>\\)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1952 (if semantic-flex-enable-newlines |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1953 (setq ep (match-end 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1954 ts (cons (cons 'newline |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1955 (cons (match-beginning 1) ep)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1956 ts)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1957 ;; catch whitespace when needed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1958 ((looking-at "\\s-+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1959 (if semantic-flex-enable-whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1960 ;; Language wants whitespaces, link them together. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1961 (if (eq (car (car ts)) 'whitespace) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1962 (setcdr (cdr (car ts)) (match-end 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1963 (setq ts (cons (cons 'whitespace |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1964 (cons (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1965 (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1966 ts))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1967 ;; numbers |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1968 ((and semantic-number-expression |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1969 (looking-at semantic-number-expression)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1970 (setq ts (cons (cons 'number |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1971 (cons (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1972 (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1973 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1974 ;; symbols |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1975 ((looking-at "\\(\\sw\\|\\s_\\)+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1976 (setq ts (cons (cons |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1977 ;; Get info on if this is a keyword or not |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1978 (or (semantic-flex-keyword-p (match-string 0)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1979 'symbol) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1980 (cons (match-beginning 0) (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1981 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1982 ;; Character quoting characters (ie, \n as newline) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1983 ((looking-at "\\s\\+") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1984 (setq ts (cons (cons 'charquote |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1985 (cons (match-beginning 0) (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1986 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1987 ;; Open parens, or semantic-lists. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1988 ((looking-at "\\s(") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1989 (if (or (not depth) (< curdepth depth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1990 (progn |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1991 (setq curdepth (1+ curdepth)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1992 (setq ts (cons (cons 'open-paren |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1993 (cons (match-beginning 0) (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1994 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1995 (setq ts (cons |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1996 (cons 'semantic-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1997 (cons (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1998 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
1999 (condition-case nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2000 (forward-list 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2001 ;; This case makes flex robust |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2002 ;; to broken lists. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2003 (error |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2004 (goto-char |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2005 (funcall |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2006 semantic-flex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2007 'semantic-list |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2008 start end)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2009 (setq ep (point))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2010 ts)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2011 ;; Close parens |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2012 ((looking-at "\\s)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2013 (setq ts (cons (cons 'close-paren |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2014 (cons (match-beginning 0) (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2015 ts)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2016 (setq curdepth (1- curdepth))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2017 ;; String initiators |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2018 ((looking-at "\\s\"") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2019 ;; Zing to the end of this string. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2020 (setq ts (cons (cons 'string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2021 (cons (match-beginning 0) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2022 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2023 (condition-case nil |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2024 (forward-sexp 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2025 ;; This case makes flex |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2026 ;; robust to broken strings. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2027 (error |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2028 (goto-char |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2029 (funcall |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2030 semantic-flex-unterminated-syntax-end-function |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2031 'string |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2032 start end)))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2033 (setq ep (point))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2034 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2035 ;; comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2036 ((looking-at cs) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2037 (if (and semantic-ignore-comments |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2038 (not semantic-flex-enable-whitespace)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2039 ;; If the language doesn't deal with comments nor |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2040 ;; whitespaces, ignore them here. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2041 (let ((comment-start-point (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2042 (forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2043 (if (eq (point) comment-start-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2044 ;; In this case our start-skip string failed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2045 ;; to work properly. Lets try and move over |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2046 ;; whatever white space we matched to begin |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2047 ;; with. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2048 (skip-syntax-forward "-.'" |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2049 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2050 (end-of-line) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2051 (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2052 ;;(forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2053 ;; Generate newline token if enabled |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2054 (if (and semantic-flex-enable-newlines |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2055 (bolp)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2056 (backward-char 1))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2057 (if (eq (point) comment-start-point) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2058 (error "Strange comment syntax prevents lexical analysis")) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2059 (setq ep (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2060 (let ((tk (if semantic-ignore-comments 'whitespace 'comment))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2061 (save-excursion |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2062 (forward-comment 1) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2063 ;; Generate newline token if enabled |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2064 (if (and semantic-flex-enable-newlines |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2065 (bolp)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2066 (backward-char 1)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2067 (setq ep (point))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2068 ;; Language wants comments or want them as whitespaces, |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2069 ;; link them together. |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2070 (if (eq (car (car ts)) tk) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2071 (setcdr (cdr (car ts)) ep) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2072 (setq ts (cons (cons tk (cons (match-beginning 0) ep)) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2073 ts)))))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2074 ;; punctuation |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2075 ((looking-at "\\(\\s.\\|\\s$\\|\\s'\\)") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2076 (setq ts (cons (cons 'punctuation |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2077 (cons (match-beginning 0) (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2078 ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2079 ;; unknown token |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2080 (t |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2081 (error "What is that?"))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2082 (goto-char (or ep (match-end 0))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2083 (setq ep nil))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2084 ;; maybe catch the last beginning of line when needed |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2085 (and semantic-flex-enable-bol |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2086 (= (point) end) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2087 (bolp) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2088 (setq ts (cons (cons 'bol (cons (point) (point))) ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2089 (goto-char pos) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2090 ;;(message "Flexing muscles...done") |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2091 (nreverse ts))) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2092 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2093 (provide 'semantic/lex) |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2094 |
6524f06f3a75
cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff
changeset
|
2095 ;;; semantic-lex.el ends here |