summaryrefslogtreecommitdiff
path: root/pygments/lexers/parsers.py
diff options
context:
space:
mode:
Diffstat (limited to 'pygments/lexers/parsers.py')
-rw-r--r--pygments/lexers/parsers.py131
1 files changed, 107 insertions, 24 deletions
diff --git a/pygments/lexers/parsers.py b/pygments/lexers/parsers.py
index 0ead39be..fc8cbb6f 100644
--- a/pygments/lexers/parsers.py
+++ b/pygments/lexers/parsers.py
@@ -5,7 +5,7 @@
Lexers for parser generators.
- :copyright: Copyright 2006-2010 by the Pygments team, see AUTHORS.
+ :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
@@ -28,7 +28,8 @@ __all__ = ['RagelLexer', 'RagelEmbeddedLexer', 'RagelCLexer', 'RagelDLexer',
'AntlrPerlLexer', 'AntlrRubyLexer', 'AntlrCppLexer',
#'AntlrCLexer',
'AntlrCSharpLexer', 'AntlrObjectiveCLexer',
- 'AntlrJavaLexer', "AntlrActionScriptLexer"]
+ 'AntlrJavaLexer', "AntlrActionScriptLexer",
+ 'TreetopLexer']
class RagelLexer(RegexLexer):
@@ -37,7 +38,7 @@ class RagelLexer(RegexLexer):
fragments of Ragel. For ``.rl`` files, use RagelEmbeddedLexer instead
(or one of the language-specific subclasses).
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel'
@@ -72,8 +73,8 @@ class RagelLexer(RegexLexer):
],
'operators': [
(r',', Operator), # Join
- (r'\||&|-|--', Operator), # Union, Intersection and Subtraction
- (r'\.|<:|:>|:>>', Operator), # Concatention
+ (r'\||&|--?', Operator), # Union, Intersection and Subtraction
+ (r'\.|<:|:>>?', Operator), # Concatention
(r':', Operator), # Label
(r'->', Operator), # Epsilon Transition
(r'(>|\$|%|<|@|<>)(/|eof\b)', Operator), # EOF Actions
@@ -131,7 +132,7 @@ class RagelEmbeddedLexer(RegexLexer):
This will only highlight Ragel statements. If you want host language
highlighting then call the language-specific Ragel lexer.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Embedded Ragel'
@@ -204,14 +205,14 @@ class RagelEmbeddedLexer(RegexLexer):
}
def analyse_text(text):
- return '@LANG: indep' in text or 0.1
+ return '@LANG: indep' in text
class RagelRubyLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in a Ruby host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in Ruby Host'
@@ -230,7 +231,7 @@ class RagelCLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in a C host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in C Host'
@@ -249,7 +250,7 @@ class RagelDLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in a D host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in D Host'
@@ -267,7 +268,7 @@ class RagelCppLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in a CPP host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in CPP Host'
@@ -285,7 +286,7 @@ class RagelObjectiveCLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in an Objective C host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in Objective C Host'
@@ -305,7 +306,7 @@ class RagelJavaLexer(DelegatingLexer):
"""
A lexer for `Ragel`_ in a Java host file.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'Ragel in Java Host'
@@ -326,7 +327,7 @@ class AntlrLexer(RegexLexer):
Should not be called directly, instead
use DelegatingLexer for your target language.
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
.. _ANTLR: http://www.antlr.org/
"""
@@ -393,7 +394,7 @@ class AntlrLexer(RegexLexer):
# throwsSpec
(r'(throws)(\s+)(' + _id + ')',
bygroups(Keyword, Whitespace, Name.Label)),
- (r'(?:(,)(\s*)(' + _id + '))+',
+ (r'(,)(\s*)(' + _id + ')',
bygroups(Punctuation, Whitespace, Name.Label)), # Additional throws
# optionsSpec
(r'options\b', Keyword, 'options'),
@@ -523,7 +524,7 @@ class AntlrLexer(RegexLexer):
# """
# ANTLR with C Target
#
-# *New in Pygments 1.1*
+# .. versionadded:: 1.1
# """
#
# name = 'ANTLR With C Target'
@@ -540,7 +541,7 @@ class AntlrCppLexer(DelegatingLexer):
"""
`ANTLR`_ with CPP Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With CPP Target'
@@ -559,7 +560,7 @@ class AntlrObjectiveCLexer(DelegatingLexer):
"""
`ANTLR`_ with Objective-C Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With ObjectiveC Target'
@@ -579,7 +580,7 @@ class AntlrCSharpLexer(DelegatingLexer):
"""
`ANTLR`_ with C# Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With C# Target'
@@ -599,7 +600,7 @@ class AntlrPythonLexer(DelegatingLexer):
"""
`ANTLR`_ with Python Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With Python Target'
@@ -619,7 +620,7 @@ class AntlrJavaLexer(DelegatingLexer):
"""
`ANTLR`_ with Java Target
- *New in Pygments 1.1*
+ .. versionadded:: 1.
"""
name = 'ANTLR With Java Target'
@@ -639,7 +640,7 @@ class AntlrRubyLexer(DelegatingLexer):
"""
`ANTLR`_ with Ruby Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With Ruby Target'
@@ -659,7 +660,7 @@ class AntlrPerlLexer(DelegatingLexer):
"""
`ANTLR`_ with Perl Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With Perl Target'
@@ -679,7 +680,7 @@ class AntlrActionScriptLexer(DelegatingLexer):
"""
`ANTLR`_ with ActionScript Target
- *New in Pygments 1.1.*
+ .. versionadded:: 1.1
"""
name = 'ANTLR With ActionScript Target'
@@ -693,3 +694,85 @@ class AntlrActionScriptLexer(DelegatingLexer):
def analyse_text(text):
return AntlrLexer.analyse_text(text) and \
re.search(r'^\s*language\s*=\s*ActionScript\s*;', text, re.M)
+
+class TreetopBaseLexer(RegexLexer):
+ """
+ A base lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars.
+ Not for direct use; use TreetopLexer instead.
+
+ .. versionadded:: 1.6
+ """
+
+ tokens = {
+ 'root': [
+ include('space'),
+ (r'require[ \t]+[^\n\r]+[\n\r]', Other),
+ (r'module\b', Keyword.Namespace, 'module'),
+ (r'grammar\b', Keyword, 'grammar'),
+ ],
+ 'module': [
+ include('space'),
+ include('end'),
+ (r'module\b', Keyword, '#push'),
+ (r'grammar\b', Keyword, 'grammar'),
+ (r'[A-Z][A-Za-z_0-9]*(?:::[A-Z][A-Za-z_0-9]*)*', Name.Namespace),
+ ],
+ 'grammar': [
+ include('space'),
+ include('end'),
+ (r'rule\b', Keyword, 'rule'),
+ (r'include\b', Keyword, 'include'),
+ (r'[A-Z][A-Za-z_0-9]*', Name),
+ ],
+ 'include': [
+ include('space'),
+ (r'[A-Z][A-Za-z_0-9]*(?:::[A-Z][A-Za-z_0-9]*)*', Name.Class, '#pop'),
+ ],
+ 'rule': [
+ include('space'),
+ include('end'),
+ (r'"(\\\\|\\"|[^"])*"', String.Double),
+ (r"'(\\\\|\\'|[^'])*'", String.Single),
+ (r'([A-Za-z_][A-Za-z_0-9]*)(:)', bygroups(Name.Label, Punctuation)),
+ (r'[A-Za-z_][A-Za-z_0-9]*', Name),
+ (r'[()]', Punctuation),
+ (r'[?+*/&!~]', Operator),
+ (r'\[(?:\\.|\[:\^?[a-z]+:\]|[^\\\]])+\]', String.Regex),
+ (r'([0-9]*)(\.\.)([0-9]*)',
+ bygroups(Number.Integer, Operator, Number.Integer)),
+ (r'(<)([^>]+)(>)', bygroups(Punctuation, Name.Class, Punctuation)),
+ (r'{', Punctuation, 'inline_module'),
+ (r'\.', String.Regex),
+ ],
+ 'inline_module': [
+ (r'{', Other, 'ruby'),
+ (r'}', Punctuation, '#pop'),
+ (r'[^{}]+', Other),
+ ],
+ 'ruby': [
+ (r'{', Other, '#push'),
+ (r'}', Other, '#pop'),
+ (r'[^{}]+', Other),
+ ],
+ 'space': [
+ (r'[ \t\n\r]+', Whitespace),
+ (r'#[^\n]*', Comment.Single),
+ ],
+ 'end': [
+ (r'end\b', Keyword, '#pop'),
+ ],
+ }
+
+class TreetopLexer(DelegatingLexer):
+ """
+ A lexer for `Treetop <http://treetop.rubyforge.org/>`_ grammars.
+
+ .. versionadded:: 1.6
+ """
+
+ name = 'Treetop'
+ aliases = ['treetop']
+ filenames = ['*.treetop', '*.tt']
+
+ def __init__(self, **options):
+ super(TreetopLexer, self).__init__(RubyLexer, TreetopBaseLexer, **options)