12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2007 The Closure Linter Authors. All Rights Reserved.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Licensed under the Apache License, Version 2.0 (the "License");
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# you may not use this file except in compliance with the License.
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# You may obtain a copy of the License at
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#      http://www.apache.org/licenses/LICENSE-2.0
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Unless required by applicable law or agreed to in writing, software
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distributed under the License is distributed on an "AS-IS" BASIS,
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# See the License for the specific language governing permissions and
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# limitations under the License.
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis"""Regular expression based JavaScript matcher classes."""
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis__author__ = ('robbyw@google.com (Robert Walker)',
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis              'ajp@google.com (Andy Perelson)')
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter.common import position
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom closure_linter.common import tokens
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Shorthand
262da489cd246702bee5938545b18a6f710ed214bcJamie GennisToken = tokens.Token
272da489cd246702bee5938545b18a6f710ed214bcJamie GennisPosition = position.Position
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass Matcher(object):
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  """A token matcher.
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  Specifies a pattern to match, the type of token it represents, what mode the
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  token changes to, and what mode the token applies to.
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  Modes allow more advanced grammars to be incorporated, and are also necessary
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  to tokenize line by line.  We can have different patterns apply to different
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  modes - i.e. looking for documentation while in comment mode.
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  Attributes:
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    regex: The regular expression representing this matcher.
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    type: The type of token indicated by a successful match.
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    result_mode: The mode to move to after a successful match.
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  """
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  def __init__(self, regex, token_type, result_mode=None, line_start=False):
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Create a new matcher template.
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    Args:
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      regex: The regular expression to match.
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      token_type: The type of token a successful match indicates.
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      result_mode: What mode to change to after a successful match.  Defaults to
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        None, which means to not change the current mode.
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      line_start: Whether this matcher should only match string at the start
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        of a line.
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.regex = regex
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.type = token_type
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.result_mode = result_mode
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    self.line_start = line_start
61