annotate lisp/cedet/semantic/lex.el @ 105340:118ad0cdd9a8

Doc/message fixes.
author Glenn Morris <rgm@gnu.org>
date Thu, 01 Oct 2009 04:54:05 +0000
parents bbd7017a25d9
children 7f4c7f5c0eba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
105260
bbd7017a25d9 CEDET (development tools) package merged.
Chong Yidong <cyd@stupidchicken.com>
parents: 104513
diff changeset
1 ;;; semantic/lex.el --- Lexical Analyzer builder
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
4 ;; 2008, 2009 Free Software Foundation, Inc.
104413
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
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
44 ;; is tested for a given point. When the condition is true, the forms
104413
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
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
49 ;; analyzer point is moved without pushing a token, then the matched
104413
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
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
64 ;; derivative macros. A single analyzer defines a regular expression
104413
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 ;;
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
108 ;; Lexical type table - A table of symbols declared in a grammar
104413
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
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
118 ;; predetermined attributes. For now these two attributes are
104413
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 ;;
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
121 ;; * matchdatatype : define the kind of lexical analyzer. That is :
104413
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
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
139 ;; expression. When syntax is matched the corresponding type
104413
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)
105260
bbd7017a25d9 CEDET (development tools) package merged.
Chong Yidong <cyd@stupidchicken.com>
parents: 104513
diff changeset
185
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
186 ;;; Code:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
187
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
188 ;;; Semantic 2.x lexical analysis
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
189 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
190 (defun semantic-lex-map-symbols (fun table &optional property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
191 "Call function FUN on every symbol in TABLE.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
192 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
193 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
194 (if (arrayp table)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
195 (mapatoms
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
196 #'(lambda (symbol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
197 (if (or (null property) (get symbol property))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
198 (funcall fun symbol)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
199 table)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
200
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
201 ;;; Lexical keyword table handling.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
202 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
203 ;; 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
204 ;; %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
205
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
206 (defvar semantic-flex-keywords-obarray nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
207 "Buffer local keyword obarray for the lexical analyzer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
208 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
209 (make-variable-buffer-local 'semantic-flex-keywords-obarray)
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 (defmacro semantic-lex-keyword-invalid (name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
212 "Signal that NAME is an invalid keyword name."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
213 `(signal 'wrong-type-argument '(semantic-lex-keyword-p ,name)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
214
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
215 (defsubst semantic-lex-keyword-symbol (name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
216 "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
217 (and (arrayp semantic-flex-keywords-obarray)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
218 (stringp name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
219 (intern-soft name semantic-flex-keywords-obarray)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
220
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
221 (defsubst semantic-lex-keyword-p (name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
222 "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
223 Return nil otherwise."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
224 (and (setq name (semantic-lex-keyword-symbol name))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
225 (symbol-value name)))
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 (defsubst semantic-lex-keyword-set (name value)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
228 "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
229 (set (intern name semantic-flex-keywords-obarray) value))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
230
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
231 (defsubst semantic-lex-keyword-value (name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
232 "Return value of keyword with NAME.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
233 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
234 (let ((keyword (semantic-lex-keyword-symbol name)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
235 (if keyword
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
236 (symbol-value keyword)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
237 (semantic-lex-keyword-invalid 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-put (name property value)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
240 "For keyword with NAME, set its PROPERTY to VALUE."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
241 (let ((keyword (semantic-lex-keyword-symbol name)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
242 (if keyword
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
243 (put keyword property value)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
244 (semantic-lex-keyword-invalid name))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
245
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
246 (defsubst semantic-lex-keyword-get (name property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
247 "For keyword with NAME, return its PROPERTY value."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
248 (let ((keyword (semantic-lex-keyword-symbol name)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
249 (if keyword
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
250 (get keyword property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
251 (semantic-lex-keyword-invalid name))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
252
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
253 (defun semantic-lex-make-keyword-table (specs &optional propspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
254 "Convert keyword SPECS into an obarray and return it.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
255 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
256
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
257 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
258 TOKSYM is the lexical token symbol of that keyword.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
259
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
260 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
261 apply those properties.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
262 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
263 ;; Create the symbol hash table
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
264 (let ((semantic-flex-keywords-obarray (make-vector 13 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
265 spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
266 ;; fill it with stuff
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
267 (while specs
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
268 (setq spec (car specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
269 specs (cdr specs))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
270 (semantic-lex-keyword-set (car spec) (cdr spec)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
271 ;; Apply all properties
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
272 (while propspecs
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
273 (setq spec (car propspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
274 propspecs (cdr propspecs))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
275 (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
276 semantic-flex-keywords-obarray))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
277
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
278 (defsubst semantic-lex-map-keywords (fun &optional property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
279 "Call function FUN on every lexical keyword.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
280 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
281 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
282 (semantic-lex-map-symbols
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
283 fun semantic-flex-keywords-obarray property))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
284
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
285 (defun semantic-lex-keywords (&optional property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
286 "Return a list of lexical keywords.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
287 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
288 PROPERTY set."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
289 (let (keywords)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
290 (semantic-lex-map-keywords
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
291 #'(lambda (symbol) (setq keywords (cons symbol keywords)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
292 property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
293 keywords))
104419
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
294
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
295 ;;; Inline functions:
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
296
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
297 (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
298 (defvar semantic-lex-analysis-bounds)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
299 (defvar semantic-lex-end-point)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
300
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
301 (defsubst semantic-lex-token-bounds (token)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
302 "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
303 Return a pair (START . END)."
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
304 (if (not (numberp (car (cdr token))))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
305 (cdr (cdr token))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
306 (cdr token)))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
307
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
308 (defsubst semantic-lex-token-start (token)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
309 "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
310 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
311 (car (semantic-lex-token-bounds token)))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
312
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
313 (defsubst semantic-lex-token-end (token)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
314 "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
315 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
316 (cdr (semantic-lex-token-bounds token)))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
317
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
318 (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
319 "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
320 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
321 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
322 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
323 (goto-char
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
324 (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
325 syntax
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
326 (car semantic-lex-analysis-bounds)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
327 (cdr semantic-lex-analysis-bounds)
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
328 ))
b1ac14799f78 cedet/semantic/analyze.el, cedet/semantic/complete.el,
Chong Yidong <cyd@stupidchicken.com>
parents: 104416
diff changeset
329 (setq semantic-lex-end-point (point)))
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
330
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
331 ;;; Type table handling.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
332 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
333 ;; 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
334 ;; with the %type declaration. Types represent different syntaxes.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
335 ;; 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
336 ;; types of syntax.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
337 (defvar semantic-lex-types-obarray nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
338 "Buffer local types obarray for the lexical analyzer.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
339 (make-variable-buffer-local 'semantic-lex-types-obarray)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
340
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
341 (defmacro semantic-lex-type-invalid (type)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
342 "Signal that TYPE is an invalid lexical type name."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
343 `(signal 'wrong-type-argument '(semantic-lex-type-p ,type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
344
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
345 (defsubst semantic-lex-type-symbol (type)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
346 "Return symbol with TYPE or nil if not found."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
347 (and (arrayp semantic-lex-types-obarray)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
348 (stringp type)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
349 (intern-soft type semantic-lex-types-obarray)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
350
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
351 (defsubst semantic-lex-type-p (type)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
352 "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
353 (and (setq type (semantic-lex-type-symbol type))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
354 (symbol-value type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
355
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
356 (defsubst semantic-lex-type-set (type value)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
357 "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
358 (set (intern type semantic-lex-types-obarray) value))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
359
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
360 (defsubst semantic-lex-type-value (type &optional noerror)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
361 "Return value of symbol with TYPE name.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
362 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
363 TYPE name does not exist. Otherwise signal an error."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
364 (let ((sym (semantic-lex-type-symbol type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
365 (if sym
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
366 (symbol-value sym)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
367 (unless noerror
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
368 (semantic-lex-type-invalid type)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
369
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
370 (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
371 "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
372 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
373 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
374 (let ((sym (semantic-lex-type-symbol type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
375 (unless sym
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
376 (or add (semantic-lex-type-invalid type))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
377 (semantic-lex-type-set type nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
378 (setq sym (semantic-lex-type-symbol type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
379 (put sym property value)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
380
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
381 (defsubst semantic-lex-type-get (type property &optional noerror)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
382 "For symbol with TYPE name, return its PROPERTY value.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
383 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
384 TYPE name does not exist. Otherwise signal an error."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
385 (let ((sym (semantic-lex-type-symbol type)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
386 (if sym
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
387 (get sym property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
388 (unless noerror
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
389 (semantic-lex-type-invalid type)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
390
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
391 (defun semantic-lex-preset-default-types ()
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
392 "Install useful default properties for well known types."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
393 (semantic-lex-type-put "punctuation" 'matchdatatype 'string t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
394 (semantic-lex-type-put "punctuation" 'syntax "\\(\\s.\\|\\s$\\|\\s'\\)+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
395 (semantic-lex-type-put "keyword" 'matchdatatype 'keyword t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
396 (semantic-lex-type-put "keyword" 'syntax "\\(\\sw\\|\\s_\\)+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
397 (semantic-lex-type-put "symbol" 'matchdatatype 'regexp t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
398 (semantic-lex-type-put "symbol" 'syntax "\\(\\sw\\|\\s_\\)+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
399 (semantic-lex-type-put "string" 'matchdatatype 'sexp t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
400 (semantic-lex-type-put "string" 'syntax "\\s\"")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
401 (semantic-lex-type-put "number" 'matchdatatype 'regexp t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
402 (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
403 (semantic-lex-type-put "block" 'matchdatatype 'block t)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
404 (semantic-lex-type-put "block" 'syntax "\\s(\\|\\s)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
405 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
406
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
407 (defun semantic-lex-make-type-table (specs &optional propspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
408 "Convert type SPECS into an obarray and return it.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
409 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
410
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
411 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
412 TOKENS is an list of (TOKSYM . MATCHER) elements, where:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
414 TOKSYM is any lexical token symbol.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
415 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
416 lexical token.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
417
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
418 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
419 apply those properties.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
420 PROPSPECS must be a list of (TYPE PROPERTY VALUE)."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
421 ;; Create the symbol hash table
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
422 (let* ((semantic-lex-types-obarray (make-vector 13 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
423 spec type tokens token alist default)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
424 ;; fill it with stuff
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
425 (while specs
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
426 (setq spec (car specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
427 specs (cdr specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
428 type (car spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
429 tokens (cdr spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
430 default nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
431 alist nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
432 (while tokens
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
433 (setq token (car tokens)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
434 tokens (cdr tokens))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
435 (if (cdr token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
436 (setq alist (cons token alist))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
437 (setq token (car token))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
438 (if default
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
439 (message
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
440 "*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
441 type default token))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
442 (setq default token)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
443 ;; Ensure the default matching spec is the first one.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
444 (semantic-lex-type-set type (cons default (nreverse alist))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
445 ;; Install useful default types & properties
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
446 (semantic-lex-preset-default-types)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
447 ;; Apply all properties
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
448 (while propspecs
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
449 (setq spec (car propspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
450 propspecs (cdr propspecs))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
451 ;; Create the type if necessary.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
452 (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
453 semantic-lex-types-obarray))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
454
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
455 (defsubst semantic-lex-map-types (fun &optional property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
456 "Call function FUN on every lexical type.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
457 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
458 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
459 (semantic-lex-map-symbols
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
460 fun semantic-lex-types-obarray property))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
461
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
462 (defun semantic-lex-types (&optional property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
463 "Return a list of lexical type symbols.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
464 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
465 PROPERTY set."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
466 (let (types)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
467 (semantic-lex-map-types
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
468 #'(lambda (symbol) (setq types (cons symbol types)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
469 property)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
470 types))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
471
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
472 ;;; Lexical Analyzer framework settings
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
473 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
474
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
475 (defvar semantic-lex-analyzer 'semantic-flex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
476 "The lexical analyzer used for a given buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
477 See `semantic-lex' for documentation.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
478 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
479 (make-variable-buffer-local 'semantic-lex-analyzer)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
480
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
481 (defvar semantic-lex-tokens
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
482 '(
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
483 (bol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
484 (charquote)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
485 (close-paren)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
486 (comment)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
487 (newline)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
488 (open-paren)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
489 (punctuation)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
490 (semantic-list)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
491 (string)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
492 (symbol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
493 (whitespace)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
494 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
495 "An alist of of semantic token types.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
496 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
497 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
498
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
499 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
500 \\[semantic-flex] returns. These are
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
501
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
502 - bol: Empty string matching a beginning of line.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
503 This token is produced with
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
504 `semantic-lex-beginning-of-line'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
505
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
506 - charquote: String sequences that match `\\s\\+' regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
507 This token is produced with `semantic-lex-charquote'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
508
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
509 - close-paren: Characters that match `\\s)' regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
510 These are typically `)', `}', `]', etc.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
511 This token is produced with
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
512 `semantic-lex-close-paren'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
513
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
514 - comment: A comment chunk. These token types are not
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
515 produced by default.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
516 This token is produced with `semantic-lex-comments'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
517 Comments are ignored with `semantic-lex-ignore-comments'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
518 Comments are treated as whitespace with
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
519 `semantic-lex-comments-as-whitespace'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
520
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
521 - newline Characters matching `\\s-*\\(\n\\|\\s>\\)' regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
522 This token is produced with `semantic-lex-newline'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
523
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
524 - open-paren: Characters that match `\\s(' regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
525 These are typically `(', `{', `[', etc.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
526 If `semantic-lex-paren-or-list' is used,
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
527 then `open-paren' is not usually generated unless
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
528 the `depth' argument to \\[semantic-lex] is
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
529 greater than 0.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
530 This token is always produced if the analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
531 `semantic-lex-open-paren' is used.
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 - punctuation: Characters matching `{\\(\\s.\\|\\s$\\|\\s'\\)'
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
534 regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
535 This token is produced with `semantic-lex-punctuation'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
536 Always specify this analyzer after the comment
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
537 analyzer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
538
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
539 - semantic-list: String delimited by matching parenthesis, braces,
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
540 etc. that the lexer skipped over, because the
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
541 `depth' parameter to \\[semantic-flex] was not high
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
542 enough.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
543 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
544
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
545 - string: Quoted strings, i.e., string sequences that start
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
546 and end with characters matching `\\s\"'
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
547 regexp. The lexer relies on @code{forward-sexp} to
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
548 find the matching end.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
549 This token is produced with `semantic-lex-string'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
550
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
551 - symbol: String sequences that match `\\(\\sw\\|\\s_\\)+'
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
552 regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
553 This token is produced with
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
554 `semantic-lex-symbol-or-keyword'. Always add this analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
555 after `semantic-lex-number', or other analyzers that
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
556 match its regular expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
557
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
558 - whitespace: Characters that match `\\s-+' regexp.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
559 This token is produced with `semantic-lex-whitespace'.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
560
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
561 (defvar semantic-lex-syntax-modifications nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
562 "Changes to the syntax table for this buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
563 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
564 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
565 (CHAR CLASS)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
566 CHAR is the char passed to `modify-syntax-entry',
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
567 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
568 what syntax class CHAR has.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
569 (make-variable-buffer-local 'semantic-lex-syntax-modifications)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
570
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
571 (defvar semantic-lex-syntax-table nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
572 "Syntax table used by lexical analysis.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
573 See also `semantic-lex-syntax-modifications'.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
574 (make-variable-buffer-local 'semantic-lex-syntax-table)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
575
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
576 (defvar semantic-lex-comment-regex nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
577 "Regular expression for identifying comment start during lexical analysis.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
578 This may be automatically set when semantic initializes in a mode, but
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
579 may need to be overridden for some special languages.")
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
580 (make-variable-buffer-local 'semantic-lex-comment-regex)
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 (defvar semantic-lex-number-expression
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
583 ;; 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
584 ;; here for C and any other similar language.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
585 (eval-when-compile
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
586 (concat "\\("
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
587 "\\<[0-9]+[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
588 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
589 "\\<[0-9]+[.][eE][-+]?[0-9]+[fFdD]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
590 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
591 "\\<[0-9]+[.][fFdD]\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
592 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
593 "\\<[0-9]+[.]"
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 "[.][0-9]+\\([eE][-+]?[0-9]+\\)?[fFdD]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
596 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
597 "\\<[0-9]+[eE][-+]?[0-9]+[fFdD]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
598 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
599 "\\<0[xX][0-9a-fA-F]+[lL]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
600 "\\|"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
601 "\\<[0-9]+[lLfFdD]?\\>"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
602 "\\)"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
603 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
604 "Regular expression for matching a number.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
605 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
606 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
607
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
608 DECIMAL_LITERAL:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
609 [1-9][0-9]*
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
610 ;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
611 HEX_LITERAL:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
612 0[xX][0-9a-fA-F]+
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
613 ;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
614 OCTAL_LITERAL:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
615 0[0-7]*
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 INTEGER_LITERAL:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
618 <DECIMAL_LITERAL>[lL]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
619 | <HEX_LITERAL>[lL]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
620 | <OCTAL_LITERAL>[lL]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
621 ;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
622 EXPONENT:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
623 [eE][+-]?[09]+
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 FLOATING_POINT_LITERAL:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
626 [0-9]+[.][0-9]*<EXPONENT>?[fFdD]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
627 | [.][0-9]+<EXPONENT>?[fFdD]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
628 | [0-9]+<EXPONENT>[fFdD]?
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
629 | [0-9]+<EXPONENT>?[fFdD]
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
630 ;")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
631 (make-variable-buffer-local 'semantic-lex-number-expression)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
632
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
633 (defvar semantic-lex-depth 0
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
634 "Default lexing depth.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
635 This specifies how many lists to create tokens in.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
636 (make-variable-buffer-local 'semantic-lex-depth)
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 (defvar semantic-lex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
639 (lambda (syntax syntax-start lex-end) lex-end)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
640 "Function called when unterminated syntax is encountered.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
641 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
642 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
643 SYNTAX-START where the broken syntax begins.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
644 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
645 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
646 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
647 when finding unterminated syntax.")
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 ;;; Interactive testing commands
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
650
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
651 (declare-function semantic-elapsed-time "semantic")
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
652
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
653 (defun semantic-lex-test (arg)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
654 "Test the semantic lexer in the current buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
655 If universal argument ARG, then try the whole buffer."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
656 (interactive "P")
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
657 (require 'semantic)
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
658 (let* ((start (current-time))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
659 (result (semantic-lex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
660 (if arg (point-min) (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
661 (point-max)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
662 (end (current-time)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
663 (message "Elapsed Time: %.2f seconds."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
664 (semantic-elapsed-time start end))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
665 (pop-to-buffer "*Lexer Output*")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
666 (require 'pp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
667 (erase-buffer)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
668 (insert (pp-to-string result))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
669 (goto-char (point-min))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
670 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
671
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
672 (defvar semantic-lex-debug nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
673 "When non-nil, debug the local lexical analyzer.")
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-debug (arg)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
676 "Debug the semantic lexer in the current buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
677 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
678 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
679 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
680 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
681 (interactive "P")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
682 (require 'semantic/debug)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
683 (let ((semantic-lex-debug t))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
684 (semantic-lex-test arg)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
685
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
686 (defun semantic-lex-highlight-token (token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
687 "Highlight the lexical TOKEN.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
688 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
689 Return the overlay."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
690 (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
691 (semantic-lex-token-end token))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
692 (semantic-overlay-put o 'face 'highlight)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
693 o))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
694
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
695 (defsubst semantic-lex-debug-break (token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
696 "Break during lexical analysis at TOKEN."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
697 (when semantic-lex-debug
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
698 (let ((o nil))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
699 (unwind-protect
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
700 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
701 (when token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
702 (setq o (semantic-lex-highlight-token token)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
703 (semantic-read-event
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
704 (format "%S :: SPC - continue" token))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
705 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
706 (when o
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
707 (semantic-overlay-delete o))))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
708
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
709 ;;; Lexical analyzer creation
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
710 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
711 ;; 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
712 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
713 ;; 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
714 ;; 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
715 ;; goes with it.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
716 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
717 ;; 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
718 ;; with the behaviors of all the individual analyzers.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
719 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
720 (defmacro semantic-lex-one-token (analyzers)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
721 "Calculate one token from the current buffer at point.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
722 Uses locally bound variables from `define-lex'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
723 Argument ANALYZERS is the list of analyzers being used."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
724 (cons 'cond (mapcar #'symbol-value analyzers)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
725
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
726 (defvar semantic-lex-end-point nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
727 "The end point as tracked through lexical functions.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
728
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
729 (defvar semantic-lex-current-depth nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
730 "The current depth as tracked through lexical functions.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
731
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
732 (defvar semantic-lex-maximum-depth nil
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
733 "The maximum depth of parenthesis as tracked through lexical functions.")
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
734
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
735 (defvar semantic-lex-token-stream nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
736 "The current token stream we are collecting.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
737
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
738 (defvar semantic-lex-analysis-bounds nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
739 "The bounds of the current analysis.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
740
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
741 (defvar semantic-lex-block-streams nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
742 "Streams of tokens inside collapsed blocks.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
743 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
744 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
745 block.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
746
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
747 (defvar semantic-lex-reset-hooks nil
104513
a6a812dd2d88 * cedet/semantic/lex.el (semantic-lex-reset-hooks): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents: 104493
diff changeset
748 "Abnormal hook used by major-modes to reset lexical analyzers.
a6a812dd2d88 * cedet/semantic/lex.el (semantic-lex-reset-hooks): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents: 104493
diff changeset
749 Hook functions are called with START and END values for the
a6a812dd2d88 * cedet/semantic/lex.el (semantic-lex-reset-hooks): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents: 104493
diff changeset
750 current lexical pass. Should be set with `add-hook', specifying
a6a812dd2d88 * cedet/semantic/lex.el (semantic-lex-reset-hooks): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents: 104493
diff changeset
751 a LOCAL option.")
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
752
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
753 ;; Stack of nested blocks.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
754 (defvar semantic-lex-block-stack nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
755 ;;(defvar semantic-lex-timeout 5
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
756 ;; "*Number of sections of lexing before giving up.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
757
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
758 (defmacro define-lex (name doc &rest analyzers)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
759 "Create a new lexical analyzer with NAME.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
760 DOC is a documentation string describing this analyzer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
761 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
762 building the new NAMED analyzer. Only use analyzers which
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
763 are written to be used in `define-lex'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
764 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
765 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
766 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
767 analyzers so that the one you want to match first occurs first. For
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
768 example, it is good to put a number analyzer in front of a symbol
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
769 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
770 `(defun ,name (start end &optional depth length)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
771 ,(concat doc "\nSee `semantic-lex' for more information.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
772 ;; Make sure the state of block parsing starts over.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
773 (setq semantic-lex-block-streams nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
774 ;; Allow specialty reset items.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
775 (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
776 ;; Lexing state.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
777 (let* (;(starttime (current-time))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
778 (starting-position (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
779 (semantic-lex-token-stream nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
780 (semantic-lex-block-stack nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
781 (tmp-start start)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
782 (semantic-lex-end-point start)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
783 (semantic-lex-current-depth 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
784 ;; Use the default depth when not specified.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
785 (semantic-lex-maximum-depth
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
786 (or depth semantic-lex-depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
787 ;; Bounds needed for unterminated syntax
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
788 (semantic-lex-analysis-bounds (cons start end))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
789 ;; This entry prevents text properties from
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
790 ;; confusing our lexical analysis. See Emacs 22 (CVS)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
791 ;; version of C++ mode with template hack text properties.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
792 (parse-sexp-lookup-properties nil)
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 ;; Maybe REMOVE THIS LATER.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
795 ;; Trying to find incremental parser bug.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
796 (when (> end (point-max))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
797 (error ,(format "%s: end (%%d) > point-max (%%d)" name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
798 end (point-max)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
799 (with-syntax-table semantic-lex-syntax-table
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
800 (goto-char start)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
801 (while (and (< (point) end)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
802 (or (not length)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
803 (<= (length semantic-lex-token-stream) length)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
804 (semantic-lex-one-token ,analyzers)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
805 (when (eq semantic-lex-end-point tmp-start)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
806 (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
807 tmp-start (car semantic-lex-token-stream)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
808 (setq tmp-start semantic-lex-end-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
809 (goto-char semantic-lex-end-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
810 ;;(when (> (semantic-elapsed-time starttime (current-time))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
811 ;; semantic-lex-timeout)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
812 ;; (error "Timeout during lex at char %d" (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
813 (semantic-throw-on-input 'lex)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
814 (semantic-lex-debug-break (car semantic-lex-token-stream))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
815 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
816 ;; Check that there is no unterminated block.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
817 (when semantic-lex-block-stack
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
818 (let* ((last (pop semantic-lex-block-stack))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
819 (blk last))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
820 (while blk
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
821 (message
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
822 ,(format "%s: `%%s' block from %%S is unterminated" name)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
823 (car blk) (cadr blk))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
824 (setq blk (pop semantic-lex-block-stack)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
825 (semantic-lex-unterminated-syntax-detected (car last))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
826 ;; Return to where we started.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
827 ;; 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
828 ;; thrown, the user knows where.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
829 (goto-char starting-position)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
830 ;; Return the token stream
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
831 (nreverse semantic-lex-token-stream))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
832
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
833 ;;; Collapsed block tokens delimited by any tokens.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
834 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
835 (defun semantic-lex-start-block (syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
836 "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
837 (if (or (not semantic-lex-maximum-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
838 (< semantic-lex-current-depth semantic-lex-maximum-depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
839 (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
840 (push (list syntax (car semantic-lex-token-stream))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
841 semantic-lex-block-stack)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
842
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
843 (defun semantic-lex-end-block (syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
844 "Process the end of a previously marked SYNTAX block.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
845 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
846 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
847 class SYNTAX.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
848 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
849 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
850 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
851 (if (null semantic-lex-block-stack)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
852 (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
853 (let* ((stream semantic-lex-token-stream)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
854 (blk (pop semantic-lex-block-stack))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
855 (bstream (cdr blk))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
856 (first (car bstream))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
857 (last (pop stream)) ;; The current token mark the EOBLK
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
858 tok)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
859 (if (not (eq (car blk) syntax))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
860 ;; 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
861 ;; 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
862 ;; 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
863 ;; signaled unterminated.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
864 (semantic-lex-unterminated-syntax-detected (car blk))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
865 ;; 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
866 ;; into a separate block stream.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
867 (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
868 (push tok bstream))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
869 ;; 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
870 ;; This should not happen!
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
871 (or (eq tok first)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
872 (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
873 first syntax))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
874 ;; 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
875 ;; the lexical analysis of the block content!
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
876 ;; 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
877 ;; use: (cdr (assq start semantic-lex-block-streams)) to
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
878 ;; quickly retrieve the lexical stream associated to a block.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
879 (setcar blk (semantic-lex-token-start first))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
880 (setcdr blk (nreverse bstream))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
881 (push blk semantic-lex-block-streams)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
882 ;; 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
883 ;; a high level block token of class SYNTAX.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
884 (setq semantic-lex-token-stream stream)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
885 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
886 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
887 syntax (car blk) (semantic-lex-token-end last)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
888 ))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
889
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
890 ;;; Lexical token API
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
891 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
892 ;; 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
893 ;; instead of accessing the list structure directly because the
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
894 ;; contents of the lexical may change.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
895 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
896 (defmacro semantic-lex-token (symbol start end &optional str)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
897 "Create a lexical token.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
898 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
899 START and END define the bounds of the token in the current buffer.
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
900 Optional STR is the string for the token only if the the bounds
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
901 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
902 macro expansion.)"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
903 ;; 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
904 ;; 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
905 ;; 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
906 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
907 ;; 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
908 ;; code.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
909 (if str
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
910 `(cons ,symbol (cons ,str (cons ,start ,end)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
911 `(cons ,symbol (cons ,start ,end))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
912
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
913 (defun semantic-lex-token-p (thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
914 "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
915 This is an exhaustively robust check."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
916 (and (consp thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
917 (symbolp (car thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
918 (or (and (numberp (nth 1 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
919 (numberp (nthcdr 2 thing)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
920 (and (stringp (nth 1 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
921 (numberp (nth 2 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
922 (numberp (nthcdr 3 thing)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
923 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
924 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
925
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
926 (defun semantic-lex-token-with-text-p (thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
927 "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
928 This is an exhaustively robust check."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
929 (and (consp thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
930 (symbolp (car thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
931 (= (length thing) 4)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
932 (stringp (nth 1 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
933 (numberp (nth 2 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
934 (numberp (nth 3 thing)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
935 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
936
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
937 (defun semantic-lex-token-without-text-p (thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
938 "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
939 This is an exhaustively robust check."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
940 (and (consp thing)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
941 (symbolp (car thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
942 (= (length thing) 3)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
943 (numberp (nth 1 thing))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
944 (numberp (nth 2 thing)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
945 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
946
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
947 (eval-and-compile
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
948
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
949 (defun semantic-lex-expand-block-specs (specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
950 "Expand block specifications SPECS into a Lisp form.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
951 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
952 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
953 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
954 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
955 symbols must be non-nil too.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
956 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
957 when a BEGIN token class is encountered.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
958 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
959 an END token class is encountered."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
960 (let ((class (make-symbol "class"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
961 (form nil))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
962 (dolist (spec specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
963 (when (car spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
964 (when (nth 1 spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
965 (push `((eq ',(nth 1 spec) ,class)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
966 (semantic-lex-start-block ',(car spec)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
967 form))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
968 (when (nth 2 spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
969 (push `((eq ',(nth 2 spec) ,class)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
970 (semantic-lex-end-block ',(car spec)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
971 form))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
972 (when form
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
973 `((let ((,class (semantic-lex-token-class
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
974 (car semantic-lex-token-stream))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
975 (cond ,@(nreverse form))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
976 )))
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
977 )
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
978
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
979 (defmacro semantic-lex-push-token (token &rest blockspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
980 "Push TOKEN in the lexical analyzer token stream.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
981 Return the lexical analysis current end point.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
982 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
983 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
984 more details.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
985 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
986 `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
987 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
988 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
989 variable after calling `semantic-lex-push-token'."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
990 `(progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
991 (push ,token semantic-lex-token-stream)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
992 ,@(semantic-lex-expand-block-specs blockspecs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
993 (setq semantic-lex-end-point
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
994 (semantic-lex-token-end (car semantic-lex-token-stream)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
995 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
996
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
997 (defsubst semantic-lex-token-class (token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
998 "Fetch the class of the lexical token TOKEN.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
999 See also the function `semantic-lex-token'."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1000 (car token))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1001
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1002 (defsubst semantic-lex-token-text (token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1003 "Fetch the text associated with the lexical token TOKEN.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1004 See also the function `semantic-lex-token'."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1005 (if (stringp (car (cdr token)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1006 (car (cdr token))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1007 (buffer-substring-no-properties
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1008 (semantic-lex-token-start token)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1009 (semantic-lex-token-end token))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1010
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1011 (defun semantic-lex-init ()
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1012 "Initialize any lexical state for this buffer."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1013 (unless semantic-lex-comment-regex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1014 (setq semantic-lex-comment-regex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1015 (if comment-start-skip
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1016 (concat "\\(\\s<\\|" comment-start-skip "\\)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1017 "\\(\\s<\\)")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1018 ;; Setup the lexer syntax-table
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1019 (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
1020 (dolist (mod semantic-lex-syntax-modifications)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1021 (modify-syntax-entry
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1022 (car mod) (nth 1 mod) semantic-lex-syntax-table)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1023
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
1024 ;;;###autoload
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1025 (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
1026 "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
1027 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
1028 lists. The last argument, LENGTH specifies that `semantic-lex'
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1029 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
1030 Each element is a list, such of the form
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1031 (symbol start-expression . end-expression)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1032 where SYMBOL denotes the token type.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1033 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
1034 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
1035 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
1036 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
1037 scanning, use `narrow-to-region'."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1038 (funcall semantic-lex-analyzer start end depth length))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1039
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1040 (defsubst semantic-lex-buffer (&optional depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1041 "Lex the current buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1042 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
1043 (semantic-lex (point-min) (point-max) depth))
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 (defsubst semantic-lex-list (semlist depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1046 "Lex the body of SEMLIST to DEPTH."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1047 (semantic-lex (semantic-lex-token-start semlist)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1048 (semantic-lex-token-end semlist)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1049 depth))
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 ;;; Analyzer creation macros
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1052 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1053 ;; 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
1054 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1055 ;; 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
1056 ;; 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
1057 ;; to create new lexical analyzers.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1058
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1059 (defcustom semantic-lex-debug-analyzers nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1060 "Non nil means to debug analyzers with syntax protection.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1061 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
1062 :group 'semantic
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1063 :type 'boolean)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1064
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1065 (defmacro semantic-lex-unterminated-syntax-protection (syntax &rest forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1066 "For SYNTAX, execute FORMS with protection for unterminated syntax.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1067 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
1068 execute the unterminated syntax code. FORMS should return a position.
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
1069 Irregardless of an error, the cursor should be moved to the end of
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1070 the desired syntax, and a position returned.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1071 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
1072 debug them.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1073 Avoid using a large FORMS since it is duplicated."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1074 `(if (and debug-on-error semantic-lex-debug-analyzers)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1075 (progn ,@forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1076 (condition-case nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1077 (progn ,@forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1078 (error
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1079 (semantic-lex-unterminated-syntax-detected ,syntax)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1080 (put 'semantic-lex-unterminated-syntax-protection
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1081 'lisp-indent-function 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1082
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1083 (defmacro define-lex-analyzer (name doc condition &rest forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1084 "Create a single lexical analyzer NAME with DOC.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1085 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
1086 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
1087 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
1088 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
1089 can be used to evaluate expressions at compile time.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1090 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
1091 `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
1092 of the form (START . END)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1093 `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
1094 for the current analysis.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1095 `semantic-lex-current-depth' - The current depth of `semantic-list' that has
105340
118ad0cdd9a8 Doc/message fixes.
Glenn Morris <rgm@gnu.org>
parents: 105260
diff changeset
1096 been descended.
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1097 `semantic-lex-end-point' - End Point after match.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1098 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
1099 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
1100 `semantic-lex-token-stream' - The token list being collected.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1101 Add new lexical tokens to this list.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1102 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
1103 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
1104 at the beginning of `semantic-lex-token-stream'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1105 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
1106 `(eval-and-compile
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1107 (defvar ,name nil ,doc)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1108 (defun ,name nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1109 ;; 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
1110 (setq ,name '(,condition ,@forms))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1111 ;; 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
1112 ;; function help is automatically provided, and perhaps the
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1113 ;; function could be useful for testing and debugging one
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1114 ;; analyzer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1115 (fset ',name (lambda () ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1116 (let ((semantic-lex-token-stream nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1117 (semantic-lex-end-point (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1118 (semantic-lex-analysis-bounds
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1119 (cons (point) (point-max)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1120 (semantic-lex-current-depth 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1121 (semantic-lex-maximum-depth
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1122 semantic-lex-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1123 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1124 (when ,condition ,@forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1125 semantic-lex-token-stream)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1126 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1127
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1128 (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
1129 "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
1130 FORMS are evaluated upon a successful match.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1131 See `define-lex-analyzer' for more about analyzers."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1132 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1133 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1134 (looking-at ,regexp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1135 ,@forms
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1136 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1137
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1138 (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
1139 &optional index
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1140 &rest forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1141 "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
1142 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
1143 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
1144 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
1145 expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1146 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
1147 created. It is valid to ignore FORMS.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1148 See `define-lex-analyzer' for more about analyzers."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1149 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1150 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1151 (looking-at ,regexp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1152 ,@forms
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1153 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1154 (semantic-lex-token ,toksym
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1155 (match-beginning ,(or index 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1156 (match-end ,(or index 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1157 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1158
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1159 (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
1160 "Create a lexical analyzer NAME for paired delimiters blocks.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1161 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
1162 close delimiter depending on the value of the variable
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1163 `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
1164 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
1165 delimiters used. Each SPEC has the form:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1166
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1167 \(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
1168
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1169 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
1170 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
1171 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
1172 symbols returned in open and close tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1173 (let ((specs (cons spec1 specs))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1174 spec open olist clist)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1175 (while specs
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1176 (setq spec (car specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1177 specs (cdr specs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1178 open (nth 1 spec)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1179 ;; build alist ((OPEN-DELIM OPEN-SYM BLOCK-SYM) ...)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1180 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
1181 ;; build alist ((CLOSE-DELIM CLOSE-SYM) ...)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1182 clist (cons (nth 2 spec) clist)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1183 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1184 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1185 (and
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1186 (looking-at "\\(\\s(\\|\\s)\\)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1187 (let ((text (match-string 0)) match)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1188 (cond
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1189 ((setq match (assoc text ',olist))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1190 (if (or (not semantic-lex-maximum-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1191 (< semantic-lex-current-depth semantic-lex-maximum-depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1192 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1193 (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
1194 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1195 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1196 (nth 1 match)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1197 (match-beginning 0) (match-end 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1198 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1199 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1200 (nth 2 match)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1201 (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1202 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1203 (semantic-lex-unterminated-syntax-protection (nth 2 match)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1204 (forward-list 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1205 (point)))
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 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1208 ((setq match (assoc text ',clist))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1209 (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
1210 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1211 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1212 (nth 1 match)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1213 (match-beginning 0) (match-end 0)))))))
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
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1216 ;;; Analyzers
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1217 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1218 ;; Pre-defined common analyzers.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1219 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1220 (define-lex-analyzer semantic-lex-default-action
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1221 "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
1222 This action will just throw an error."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1223 t
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1224 (error "Unmatched Text during Lexical Analysis"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1225
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1226 (define-lex-analyzer semantic-lex-beginning-of-line
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1227 "Detect and create a beginning of line token (BOL)."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1228 (and (bolp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1229 ;; 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
1230 ;; 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
1231 ;; beginning of line.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1232 (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
1233 nil) ;; CONTINUE
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1234 ;; 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
1235 ;; 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
1236 ;; FORMS body.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1237 nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1238
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1239 (define-lex-simple-regex-analyzer semantic-lex-newline
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1240 "Detect and create newline tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1241 "\\s-*\\(\n\\|\\s>\\)" 'newline 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1242
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1243 (define-lex-regex-analyzer semantic-lex-newline-as-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1244 "Detect and create newline tokens.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1245 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
1246 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
1247 "\\s-*\\(\n\\|\\s>\\)"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1248 ;; Language wants whitespaces. Create a token for it.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1249 (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
1250 'whitespace)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1251 ;; Merge whitespace tokens together if they are adjacent. Two
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1252 ;; 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
1253 ;; the token stream.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1254 (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
1255 (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1256 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1257 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1258 'whitespace (match-beginning 0) (match-end 0)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1259
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1260 (define-lex-regex-analyzer semantic-lex-ignore-newline
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1261 "Detect and ignore newline tokens.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1262 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
1263 they are comment end characters)."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1264 "\\s-*\\(\n\\|\\s>\\)"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1265 (setq semantic-lex-end-point (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1266
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1267 (define-lex-regex-analyzer semantic-lex-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1268 "Detect and create whitespace tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1269 ;; catch whitespace when needed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1270 "\\s-+"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1271 ;; Language wants whitespaces. Create a token for it.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1272 (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
1273 'whitespace)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1274 ;; Merge whitespace tokens together if they are adjacent. Two
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1275 ;; 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
1276 ;; the token stream.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1277 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1278 (setq semantic-lex-end-point (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1279 (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
1280 semantic-lex-end-point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1281 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1282 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1283 'whitespace (match-beginning 0) (match-end 0)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1284
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1285 (define-lex-regex-analyzer semantic-lex-ignore-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1286 "Detect and skip over whitespace tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1287 ;; catch whitespace when needed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1288 "\\s-+"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1289 ;; 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
1290 (setq semantic-lex-end-point (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1291
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1292 (define-lex-simple-regex-analyzer semantic-lex-number
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1293 "Detect and create number tokens.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1294 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
1295 and number formats."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1296 semantic-lex-number-expression 'number)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1297
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1298 (define-lex-regex-analyzer semantic-lex-symbol-or-keyword
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1299 "Detect and create symbol and keyword tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1300 "\\(\\sw\\|\\s_\\)+"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1301 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1302 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1303 (or (semantic-lex-keyword-p (match-string 0)) 'symbol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1304 (match-beginning 0) (match-end 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1305
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1306 (define-lex-simple-regex-analyzer semantic-lex-charquote
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1307 "Detect and create charquote tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1308 ;; Character quoting characters (ie, \n as newline)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1309 "\\s\\+" 'charquote)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1310
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1311 (define-lex-simple-regex-analyzer semantic-lex-punctuation
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1312 "Detect and create punctuation tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1313 "\\(\\s.\\|\\s$\\|\\s'\\)" 'punctuation)
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-analyzer semantic-lex-punctuation-type
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1316 "Detect and create a punctuation type token.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1317 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
1318 types, as the value of the `punctuation' token type."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1319 (and (looking-at "\\(\\s.\\|\\s$\\|\\s'\\)+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1320 (let* ((key (match-string 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1321 (pos (match-beginning 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1322 (end (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1323 (len (- end pos))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1324 (lst (semantic-lex-type-value "punctuation" t))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1325 (def (car lst)) ;; default lexical symbol or nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1326 (lst (cdr lst)) ;; alist of (LEX-SYM . PUNCT-STRING)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1327 (elt nil))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1328 (if lst
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1329 ;; Starting with the longest one, search if the
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1330 ;; punctuation string is defined for this language.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1331 (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
1332 (setq len (1- len)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1333 key (substring key 0 len))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1334 (if elt ;; Return the punctuation token found
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1335 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1336 (semantic-lex-token (car elt) pos (+ pos len)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1337 (if def ;; Return a default generic token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1338 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1339 (semantic-lex-token def pos end))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1340 ;; Nothing match
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1341 )))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1342
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1343 (define-lex-regex-analyzer semantic-lex-paren-or-list
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1344 "Detect open parenthesis.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1345 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
1346 `semantic-lex-current-depth'."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1347 "\\s("
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1348 (if (or (not semantic-lex-maximum-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1349 (< semantic-lex-current-depth semantic-lex-maximum-depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1350 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1351 (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
1352 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1353 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1354 'open-paren (match-beginning 0) (match-end 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1355 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1356 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1357 'semantic-list (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1358 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1359 (semantic-lex-unterminated-syntax-protection 'semantic-list
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1360 (forward-list 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1361 (point))
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 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1364
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1365 (define-lex-simple-regex-analyzer semantic-lex-open-paren
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1366 "Detect and create an open parenthisis token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1367 "\\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
1368
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1369 (define-lex-simple-regex-analyzer semantic-lex-close-paren
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1370 "Detect and create a close paren token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1371 "\\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
1372
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1373 (define-lex-regex-analyzer semantic-lex-string
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1374 "Detect and create a string token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1375 "\\s\""
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1376 ;; Zing to the end of this string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1377 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1378 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1379 'string (point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1380 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1381 (semantic-lex-unterminated-syntax-protection 'string
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1382 (forward-sexp 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1383 (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1384 ))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1385
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1386 (define-lex-regex-analyzer semantic-lex-comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1387 "Detect and create a comment token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1388 semantic-lex-comment-regex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1389 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1390 (forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1391 ;; Generate newline token if enabled
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1392 (if (bolp) (backward-char 1))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1393 (setq semantic-lex-end-point (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1394 ;; Language wants comments or want them as whitespaces,
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1395 ;; link them together.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1396 (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
1397 (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
1398 semantic-lex-end-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1399 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1400 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1401 'comment (match-beginning 0) semantic-lex-end-point)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1402
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1403 (define-lex-regex-analyzer semantic-lex-comments-as-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1404 "Detect comments and create a whitespace token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1405 semantic-lex-comment-regex
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 (forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1408 ;; Generate newline token if enabled
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1409 (if (bolp) (backward-char 1))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1410 (setq semantic-lex-end-point (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1411 ;; Language wants comments or want them as whitespaces,
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1412 ;; link them together.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1413 (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
1414 (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
1415 semantic-lex-end-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1416 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1417 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1418 'whitespace (match-beginning 0) semantic-lex-end-point)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1419
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1420 (define-lex-regex-analyzer semantic-lex-ignore-comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1421 "Detect and create a comment token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1422 semantic-lex-comment-regex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1423 (let ((comment-start-point (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1424 (forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1425 (if (eq (point) comment-start-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1426 ;; In this case our start-skip string failed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1427 ;; to work properly. Lets try and move over
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1428 ;; whatever white space we matched to begin
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1429 ;; with.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1430 (skip-syntax-forward "-.'"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1431 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1432 (end-of-line)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1433 (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1434 ;; 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
1435 (if (bolp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1436 (backward-char 1)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1437 (if (eq (point) comment-start-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1438 (error "Strange comment syntax prevents lexical analysis"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1439 (setq semantic-lex-end-point (point))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1440
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1441 ;;; Comment lexer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1442 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1443 ;; 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
1444 ;; analyers.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1445
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1446 (define-lex semantic-comment-lexer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1447 "A simple lexical analyzer that handles comments.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1448 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
1449 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
1450 point."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1451 semantic-lex-ignore-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1452 semantic-lex-ignore-newline
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1453 semantic-lex-comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1454 semantic-lex-default-action)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1455
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1456 ;;; Test Lexer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1457 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1458 (define-lex semantic-simple-lexer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1459 "A simple lexical analyzer that handles simple buffers.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1460 This lexer ignores comments and whitespace, and will return
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1461 syntax as specified by the syntax table."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1462 semantic-lex-ignore-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1463 semantic-lex-ignore-newline
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1464 semantic-lex-number
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1465 semantic-lex-symbol-or-keyword
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1466 semantic-lex-charquote
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1467 semantic-lex-paren-or-list
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1468 semantic-lex-close-paren
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1469 semantic-lex-string
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1470 semantic-lex-ignore-comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1471 semantic-lex-punctuation
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1472 semantic-lex-default-action)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1473
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1474 ;;; Analyzers generated from grammar.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1475 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1476 ;; Some analyzers are hand written. Analyzers created with these
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1477 ;; functions are generated from the grammar files.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1478
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1479 (defmacro define-lex-keyword-type-analyzer (name doc syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1480 "Define a keyword type analyzer NAME with DOC string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1481 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
1482 (let ((key (make-symbol "key")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1483 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1484 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1485 (and (looking-at ,syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1486 (let ((,key (semantic-lex-keyword-p (match-string 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1487 (when ,key
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1488 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1489 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1490 ,key (match-beginning 0) (match-end 0)))))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1491 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1492
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1493 (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
1494 "Define a sexp type analyzer NAME with DOC string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1495 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
1496 TOKEN is the lexical token returned when SYNTAX matches."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1497 `(define-lex-regex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1498 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1499 ,syntax
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1500 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1501 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1502 ,token (point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1503 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1504 (semantic-lex-unterminated-syntax-protection ,token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1505 (forward-sexp 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1506 (point))))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1507 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1508
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1509 (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
1510 "Define a regexp type analyzer NAME with DOC string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1511 SYNTAX is the regexp that matches a syntactic expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1512 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
1513 expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1514 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
1515 (if matches
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1516 (let* ((val (make-symbol "val"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1517 (lst (make-symbol "lst"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1518 (elt (make-symbol "elt"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1519 (pos (make-symbol "pos"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1520 (end (make-symbol "end")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1521 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1522 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1523 (and (looking-at ,syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1524 (let* ((,val (match-string 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1525 (,pos (match-beginning 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1526 (,end (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1527 (,lst ,matches)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1528 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1529 (while (and ,lst (not ,elt))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1530 (if (string-match (cdar ,lst) ,val)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1531 (setq ,elt (caar ,lst))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1532 (setq ,lst (cdr ,lst))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1533 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1534 (semantic-lex-token (or ,elt ,default) ,pos ,end))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1535 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1536 `(define-lex-simple-regex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1537 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1538 ,syntax ,default)
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-string-type-analyzer (name doc syntax matches default)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1542 "Define a string 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 a syntactic expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1544 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
1545 expression.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1546 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
1547 (if matches
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1548 (let* ((val (make-symbol "val"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1549 (lst (make-symbol "lst"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1550 (elt (make-symbol "elt"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1551 (pos (make-symbol "pos"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1552 (end (make-symbol "end"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1553 (len (make-symbol "len")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1554 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1555 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1556 (and (looking-at ,syntax)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1557 (let* ((,val (match-string 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1558 (,pos (match-beginning 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1559 (,end (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1560 (,len (- ,end ,pos))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1561 (,lst ,matches)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1562 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1563 ;; Starting with the longest one, search if a lexical
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1564 ;; value match a token defined for this language.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1565 (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
1566 (setq ,len (1- ,len)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1567 ,val (substring ,val 0 ,len)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1568 (when ,elt ;; Adjust token end position.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1569 (setq ,elt (car ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1570 ,end (+ ,pos ,len)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1571 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1572 (semantic-lex-token (or ,elt ,default) ,pos ,end))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1573 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1574 `(define-lex-simple-regex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1575 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1576 ,syntax ,default)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1577 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1578
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1579 (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
1580 "Define a block type analyzer NAME with DOC string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1581
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1582 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
1583 open (`\\\\s(') and close (`\\\\s)') parenthesis syntax classes.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1584
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1585 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
1586
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1587 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
1588 where:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1589
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1590 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
1591
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1592 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
1593 delimiter.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1594
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1595 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
1596 that starts at the OPEN-DELIM delimiter.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1597
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1598 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
1599
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1600 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
1601
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1602 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
1603 CLOSE-DELIM delimiter.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1604
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1605 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
1606 CLOSE-SPECS.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1607
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1608 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
1609 `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
1610 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
1611 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
1612
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1613 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
1614 reference here.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1615
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1616 In the grammar:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1617
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1618 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
1619 sexp of the form:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1620
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1621 \"(OPEN-TOKEN CLOSE-TOKEN)\"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1622
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1623 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
1624 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
1625 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
1626
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1627 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
1628
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1629 %token <block> PAREN_BLOCK \"(LPAREN RPAREN)\"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1630 %token <open-paren> LPAREN \"(\"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1631 %token <close-paren> RPAREN \")\"
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 When the lexer encounters the open-paren delimiter \"(\":
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 - 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
1636 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
1637 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
1638 corresponding close-paren delimiter \")\" will be encountered, it
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1639 will return a (RPAREN start . end) token.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1640
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1641 - 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
1642 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
1643 a (PAREN_BLOCK start . end) token."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1644 (let* ((val (make-symbol "val"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1645 (lst (make-symbol "lst"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1646 (elt (make-symbol "elt")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1647 `(define-lex-analyzer ,name
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1648 ,doc
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1649 (and
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1650 (looking-at ,syntax) ;; "\\(\\s(\\|\\s)\\)"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1651 (let ((,val (match-string 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1652 (,lst ,matches)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1653 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1654 (cond
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1655 ((setq ,elt (assoc ,val (car ,lst)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1656 (if (or (not semantic-lex-maximum-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1657 (< semantic-lex-current-depth semantic-lex-maximum-depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1658 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1659 (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
1660 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1661 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1662 (nth 1 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1663 (match-beginning 0) (match-end 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1664 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1665 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1666 (nth 2 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1667 (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1668 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1669 (semantic-lex-unterminated-syntax-protection (nth 2 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1670 (forward-list 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1671 (point)))))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1672 ((setq ,elt (assoc ,val (cdr ,lst)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1673 (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
1674 (semantic-lex-push-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1675 (semantic-lex-token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1676 (nth 1 ,elt)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1677 (match-beginning 0) (match-end 0))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1678 ))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1679 ))
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 ;;; Lexical Safety
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 ;; 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
1684 ;; unbalanced syntax. Since editing is all about changeging test
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1685 ;; 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
1686 ;; inequalities.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1687
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1688 (defmacro semantic-lex-catch-errors (symbol &rest forms)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1689 "Using SYMBOL, execute FORMS catching lexical errors.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1690 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
1691 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
1692 out of date.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1693 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
1694 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
1695 (let ((ret (make-symbol "ret"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1696 (syntax (make-symbol "syntax"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1697 (start (make-symbol "start"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1698 (end (make-symbol "end")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1699 `(let* ((semantic-lex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1700 (lambda (,syntax ,start ,end)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1701 (throw ',symbol ,syntax)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1702 ;; Delete the below when semantic-flex is fully retired.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1703 (semantic-flex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1704 semantic-lex-unterminated-syntax-end-function)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1705 (,ret (catch ',symbol
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1706 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1707 ,@forms
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1708 nil))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1709 ;; Great Sadness. Assume that FORMS execute within the
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1710 ;; confines of the current buffer only! Mark this thing
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1711 ;; unparseable iff the special symbol was thrown. This
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1712 ;; will prevent future calls from parsing, but will allow
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1713 ;; then to still return the cache.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1714 (when ,ret
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1715 ;; 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
1716 ;; 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
1717 ;; problems with the idle scheduler obscuring useful data.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1718 ;;(message "Buffer not currently parsable (%S)." ,ret)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1719 (semantic-parse-tree-unparseable))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1720 ,ret)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1721 (put 'semantic-lex-catch-errors 'lisp-indent-function 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1722
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1723
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1724 ;;; Interfacing with edebug
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1725 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1726 (add-hook
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1727 'edebug-setup-hook
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1728 #'(lambda ()
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1729
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1730 (def-edebug-spec define-lex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1731 (&define name stringp (&rest symbolp))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1732 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1733 (def-edebug-spec define-lex-analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1734 (&define name stringp form def-body)
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 (def-edebug-spec define-lex-regex-analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1737 (&define name stringp form def-body)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1738 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1739 (def-edebug-spec define-lex-simple-regex-analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1740 (&define name stringp form symbolp [ &optional form ] def-body)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1741 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1742 (def-edebug-spec define-lex-block-analyzer
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1743 (&define name stringp form (&rest form))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1744 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1745 (def-edebug-spec semantic-lex-catch-errors
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1746 (symbolp def-body)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1747 )
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1748
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1749 ))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1750
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1751 ;;; Compatibility with Semantic 1.x lexical analysis
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1752 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1753 ;; NOTE: DELETE THIS SOMEDAY SOON
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1754
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1755 (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
1756 (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
1757 (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
1758 (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
1759 (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
1760 (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
1761 (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
1762 (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
1763 (semantic-alias-obsolete 'semantic-flex-keywords 'semantic-lex-keywords)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1764 (semantic-alias-obsolete 'semantic-flex-buffer 'semantic-lex-buffer)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1765 (semantic-alias-obsolete 'semantic-flex-list 'semantic-lex-list)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1766
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1767 ;; 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
1768 ;; simple tokens of the form:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1769 ;;
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1770 ;; (SYMBOL START . END)
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 ;; 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
1773 ;; objects boundary.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1774
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1775 (defvar semantic-flex-tokens semantic-lex-tokens
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1776 "An alist of of semantic token types.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1777 See variable `semantic-lex-tokens'.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1778
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1779 (defvar semantic-flex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1780 (lambda (syntax syntax-start flex-end) flex-end)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1781 "Function called when unterminated syntax is encountered.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1782 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
1783 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
1784 SYNTAX-START where the broken syntax begins.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1785 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
1786 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
1787 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
1788 when finding unterminated syntax.")
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 (defvar semantic-flex-extensions nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1791 "Buffer local extensions to the lexical analyzer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1792 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
1793 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
1794 token of the form:
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1795 ( TYPE START . END)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1796 nil is also a valid return value.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1797 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
1798 nonterminal in the language definition.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1799 (make-variable-buffer-local 'semantic-flex-extensions)
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 (defvar semantic-flex-syntax-modifications nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1802 "Changes to the syntax table for this buffer.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1803 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
1804 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
1805 (CHAR CLASS)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1806 CHAR is the char passed to `modify-syntax-entry',
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1807 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
1808 what syntax class CHAR has.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1809 (make-variable-buffer-local 'semantic-flex-syntax-modifications)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1810
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1811 (defvar semantic-ignore-comments t
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1812 "Default comment handling.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1813 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
1814 as part of the token stream.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1815 (make-variable-buffer-local 'semantic-ignore-comments)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1816
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1817 (defvar semantic-flex-enable-newlines nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1818 "When flexing, report 'newlines as syntactic elements.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1819 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
1820 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
1821 (make-variable-buffer-local 'semantic-flex-enable-newlines)
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-enable-whitespace nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1824 "When flexing, report 'whitespace as syntactic elements.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1825 Useful for languages where the syntax is whitespace dependent.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1826 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
1827 (make-variable-buffer-local 'semantic-flex-enable-whitespace)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1828
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1829 (defvar semantic-flex-enable-bol nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1830 "When flexing, report beginning of lines as syntactic elements.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1831 Useful for languages like python which are indentation sensitive.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1832 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
1833 (make-variable-buffer-local 'semantic-flex-enable-bol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1834
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1835 (defvar semantic-number-expression semantic-lex-number-expression
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1836 "See variable `semantic-lex-number-expression'.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1837 (make-variable-buffer-local 'semantic-number-expression)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1838
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1839 (defvar semantic-flex-depth 0
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1840 "Default flexing depth.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1841 This specifies how many lists to create tokens in.")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1842 (make-variable-buffer-local 'semantic-flex-depth)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1843
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1844 (defun semantic-flex (start end &optional depth length)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1845 "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
1846 Semantically check between START and END. Optional argument DEPTH
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1847 indicates at what level to scan over entire lists.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1848 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
1849 the form (symbol start-expression . end-expression) where SYMBOL
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1850 denotes the token type.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1851 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
1852 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
1853 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
1854 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
1855 scanning, use `narrow-to-region'.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1856 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
1857 return LENGTH tokens."
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1858 (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
1859 (if (not semantic-flex-keywords-obarray)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1860 (setq semantic-flex-keywords-obarray [ nil ]))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1861 (let ((ts nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1862 (pos (point))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1863 (ep nil)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1864 (curdepth 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1865 (cs (if comment-start-skip
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1866 (concat "\\(\\s<\\|" comment-start-skip "\\)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1867 (concat "\\(\\s<\\)")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1868 (newsyntax (copy-syntax-table (syntax-table)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1869 (mods semantic-flex-syntax-modifications)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1870 ;; Use the default depth if it is not specified.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1871 (depth (or depth semantic-flex-depth)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1872 ;; Update the syntax table
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1873 (while mods
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1874 (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
1875 (setq mods (cdr mods)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1876 (with-syntax-table newsyntax
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1877 (goto-char start)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1878 (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
1879 (cond
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1880 ;; catch beginning of lines when needed.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1881 ;; Must be done before catching any other tokens!
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1882 ((and semantic-flex-enable-bol
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1883 (bolp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1884 ;; 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
1885 ;; 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
1886 ;; beginning of line.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1887 (setq ts (cons (cons 'bol (cons (point) (point))) ts))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1888 nil)) ;; CONTINUE
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1889 ;; special extensions, includes whitespace, nl, etc.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1890 ((and semantic-flex-extensions
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1891 (let ((fe semantic-flex-extensions)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1892 (r nil))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1893 (while fe
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1894 (if (looking-at (car (car fe)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1895 (setq ts (cons (funcall (cdr (car fe))) ts)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1896 r t
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1897 fe nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1898 ep (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1899 (setq fe (cdr fe)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1900 (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
1901 r)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1902 ;; catch newlines when needed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1903 ((looking-at "\\s-*\\(\n\\|\\s>\\)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1904 (if semantic-flex-enable-newlines
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1905 (setq ep (match-end 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1906 ts (cons (cons 'newline
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1907 (cons (match-beginning 1) ep))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1908 ts))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1909 ;; catch whitespace when needed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1910 ((looking-at "\\s-+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1911 (if semantic-flex-enable-whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1912 ;; Language wants whitespaces, link them together.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1913 (if (eq (car (car ts)) 'whitespace)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1914 (setcdr (cdr (car ts)) (match-end 0))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1915 (setq ts (cons (cons 'whitespace
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1916 (cons (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1917 (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1918 ts)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1919 ;; numbers
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1920 ((and semantic-number-expression
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1921 (looking-at semantic-number-expression))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1922 (setq ts (cons (cons 'number
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1923 (cons (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1924 (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1925 ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1926 ;; symbols
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1927 ((looking-at "\\(\\sw\\|\\s_\\)+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1928 (setq ts (cons (cons
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1929 ;; Get info on if this is a keyword or not
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
1930 (or (semantic-lex-keyword-p (match-string 0))
104413
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1931 'symbol)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1932 (cons (match-beginning 0) (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1933 ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1934 ;; Character quoting characters (ie, \n as newline)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1935 ((looking-at "\\s\\+")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1936 (setq ts (cons (cons 'charquote
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1937 (cons (match-beginning 0) (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1938 ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1939 ;; Open parens, or semantic-lists.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1940 ((looking-at "\\s(")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1941 (if (or (not depth) (< curdepth depth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1942 (progn
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1943 (setq curdepth (1+ curdepth))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1944 (setq ts (cons (cons 'open-paren
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1945 (cons (match-beginning 0) (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1946 ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1947 (setq ts (cons
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1948 (cons 'semantic-list
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1949 (cons (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1950 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1951 (condition-case nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1952 (forward-list 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1953 ;; This case makes flex robust
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1954 ;; to broken lists.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1955 (error
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1956 (goto-char
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1957 (funcall
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1958 semantic-flex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1959 'semantic-list
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1960 start end))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1961 (setq ep (point)))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1962 ts))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1963 ;; Close parens
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1964 ((looking-at "\\s)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1965 (setq ts (cons (cons 'close-paren
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1966 (cons (match-beginning 0) (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1967 ts))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1968 (setq curdepth (1- curdepth)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1969 ;; String initiators
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1970 ((looking-at "\\s\"")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1971 ;; Zing to the end of this string.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1972 (setq ts (cons (cons 'string
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1973 (cons (match-beginning 0)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1974 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1975 (condition-case nil
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1976 (forward-sexp 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1977 ;; This case makes flex
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1978 ;; robust to broken strings.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1979 (error
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1980 (goto-char
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1981 (funcall
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1982 semantic-flex-unterminated-syntax-end-function
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1983 'string
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1984 start end))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1985 (setq ep (point)))))
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 ;; comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1988 ((looking-at cs)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1989 (if (and semantic-ignore-comments
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1990 (not semantic-flex-enable-whitespace))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1991 ;; If the language doesn't deal with comments nor
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1992 ;; whitespaces, ignore them here.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1993 (let ((comment-start-point (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1994 (forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1995 (if (eq (point) comment-start-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1996 ;; In this case our start-skip string failed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1997 ;; to work properly. Lets try and move over
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1998 ;; whatever white space we matched to begin
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
1999 ;; with.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2000 (skip-syntax-forward "-.'"
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2001 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2002 (end-of-line)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2003 (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2004 ;;(forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2005 ;; Generate newline token if enabled
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2006 (if (and semantic-flex-enable-newlines
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2007 (bolp))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2008 (backward-char 1)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2009 (if (eq (point) comment-start-point)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2010 (error "Strange comment syntax prevents lexical analysis"))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2011 (setq ep (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2012 (let ((tk (if semantic-ignore-comments 'whitespace 'comment)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2013 (save-excursion
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2014 (forward-comment 1)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2015 ;; Generate newline token if enabled
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2016 (if (and semantic-flex-enable-newlines
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2017 (bolp))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2018 (backward-char 1))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2019 (setq ep (point)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2020 ;; Language wants comments or want them as whitespaces,
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2021 ;; link them together.
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2022 (if (eq (car (car ts)) tk)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2023 (setcdr (cdr (car ts)) ep)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2024 (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
2025 ts))))))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2026 ;; punctuation
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2027 ((looking-at "\\(\\s.\\|\\s$\\|\\s'\\)")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2028 (setq ts (cons (cons 'punctuation
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2029 (cons (match-beginning 0) (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2030 ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2031 ;; unknown token
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2032 (t
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2033 (error "What is that?")))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2034 (goto-char (or ep (match-end 0)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2035 (setq ep nil)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2036 ;; maybe catch the last beginning of line when needed
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2037 (and semantic-flex-enable-bol
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2038 (= (point) end)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2039 (bolp)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2040 (setq ts (cons (cons 'bol (cons (point) (point))) ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2041 (goto-char pos)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2042 ;;(message "Flexing muscles...done")
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2043 (nreverse ts)))
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2044
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2045 (provide 'semantic/lex)
6524f06f3a75 cedet/semantic/lex.el: New file.
Chong Yidong <cyd@stupidchicken.com>
parents:
diff changeset
2046
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
2047 ;; Local variables:
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
2048 ;; generated-autoload-file: "loaddefs.el"
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
2049 ;; generated-autoload-feature: semantic/loaddefs
104447
273e528a9f9b * emacs-lisp/autoload.el (generated-autoload-load-name): New var.
Chong Yidong <cyd@stupidchicken.com>
parents: 104446
diff changeset
2050 ;; generated-autoload-load-name: "semantic/lex"
104446
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
2051 ;; End:
df08b7ab0ba0 lisp/cedet/semantic/analyze.el: Add local vars for autoloading.
Chong Yidong <cyd@stupidchicken.com>
parents: 104419
diff changeset
2052
105260
bbd7017a25d9 CEDET (development tools) package merged.
Chong Yidong <cyd@stupidchicken.com>
parents: 104513
diff changeset
2053 ;;; semantic/lex.el ends here