annotate lisp/cedet/semantic/lex.el @ 104442:b22b44e953cb

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