summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS1
-rw-r--r--doc/languages.rst1
-rw-r--r--pygments/lexers/_mapping.py1
-rw-r--r--pygments/lexers/ezhil.py68
-rw-r--r--tests/examplefiles/ezhil_primefactors.n152
-rw-r--r--tests/test_ezhil.py182
6 files changed, 405 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index 3434c20c..f8d40ee7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -8,6 +8,7 @@ Other contributors, listed alphabetically, are:
* Sam Aaron -- Ioke lexer
* Ali Afshar -- image formatter
* Thomas Aglassinger -- Easytrieve, JCL and Rexx lexers
+* Muthiah Annamalai -- Ezhil lexer
* Kumar Appaiah -- Debian control lexer
* Andreas Amann -- AppleScript lexer
* Timothy Armstrong -- Dart lexer fixes
diff --git a/doc/languages.rst b/doc/languages.rst
index 683b8752..a495d15c 100644
--- a/doc/languages.rst
+++ b/doc/languages.rst
@@ -32,6 +32,7 @@ Programming languages
* Delphi
* Dylan
* Erlang
+* `Ezhil <http://ezhillang.org>`_ Ezhil - A Tamil programming language
* Factor
* Fancy
* Fortran
diff --git a/pygments/lexers/_mapping.py b/pygments/lexers/_mapping.py
index 03a3c96e..273eee1b 100644
--- a/pygments/lexers/_mapping.py
+++ b/pygments/lexers/_mapping.py
@@ -129,6 +129,7 @@ LEXERS = {
'ErbLexer': ('pygments.lexers.templates', 'ERB', ('erb',), (), ('application/x-ruby-templating',)),
'ErlangLexer': ('pygments.lexers.erlang', 'Erlang', ('erlang',), ('*.erl', '*.hrl', '*.es', '*.escript'), ('text/x-erlang',)),
'ErlangShellLexer': ('pygments.lexers.erlang', 'Erlang erl session', ('erl',), ('*.erl-sh',), ('text/x-erl-shellsession',)),
+ 'EzhilLexer': ('pygments.lexers.ezhil', 'Ezhil', ('ezhil',), ('*.n',), ('text/x-ezhil',)),
'EvoqueHtmlLexer': ('pygments.lexers.templates', 'HTML+Evoque', ('html+evoque',), ('*.html',), ('text/html+evoque',)),
'EvoqueLexer': ('pygments.lexers.templates', 'Evoque', ('evoque',), ('*.evoque',), ('application/x-evoque',)),
'EvoqueXmlLexer': ('pygments.lexers.templates', 'XML+Evoque', ('xml+evoque',), ('*.xml',), ('application/xml+evoque',)),
diff --git a/pygments/lexers/ezhil.py b/pygments/lexers/ezhil.py
new file mode 100644
index 00000000..713541ee
--- /dev/null
+++ b/pygments/lexers/ezhil.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+"""
+ pygments.lexers.ezhil
+ ~~~~~~~~~~~~~~~~~~~~~~
+
+ Pygments lexers for Ezhil language.
+
+ :copyright: Copyright 2006-2015 by the Pygments team, see AUTHORS.
+ :license: BSD, see LICENSE for details.
+"""
+
+import re
+from pygments.lexer import RegexLexer, include, words
+from pygments.token import Keyword, Text, Comment, Name
+from pygments.token import String, Number, Punctuation, Operator
+
+__all__ = ['EzhilLexer']
+
+class EzhilLexer(RegexLexer):
+ """
+ Lexer for `Ezhil, a Tamil script-based programming language <http://ezhillang.org>`_
+
+ .. versionadded:: 2.1
+ """
+ name = 'Ezhil'
+ aliases = ['ezhil']
+ filenames = ['*.n']
+ mimetypes = ['text/x-ezhil']
+ flags = re.MULTILINE | re.UNICODE
+ # Refer to tamil.utf8.tamil_letters from open-tamil for a stricter version of this.
+ # This much simpler version is close enough, and includes combining marks.
+ _TALETTERS = u'[a-zA-Z_]|[\u0b80-\u0bff]'
+ tokens = {
+ 'root': [
+ include('keywords'),
+ (r'#.*\n', Comment.Single),
+ (r'[@+/*,^\-%]|[!<>=]=?|&&?|\|\|?', Operator),
+ (u'இல்', Operator.Word),
+ (words(('assert', 'max', 'min',
+ 'நீளம்','சரம்_இடமாற்று','சரம்_கண்டுபிடி',
+ 'பட்டியல்','பின்இணை','வரிசைப்படுத்து',
+ 'எடு','தலைகீழ்','நீட்டிக்க','நுழைக்க','வை',
+ 'கோப்பை_திற','கோப்பை_எழுது','கோப்பை_மூடு',
+ 'pi','sin','cos','tan','sqrt','hypot','pow','exp','log','log10'
+ 'min','max','exit',
+ ), suffix=r'\b'), Name.Builtin),
+ (r'(True|False)\b', Keyword.Constant),
+ (r'[^\S\n]+', Text),
+ include('identifier'),
+ include('literal'),
+ (r'[(){}\[\]:;.]', Punctuation),
+ ],
+ 'keywords': [
+ (u'பதிப்பி|தேர்ந்தெடு|தேர்வு|ஏதேனில்|ஆனால்|இல்லைஆனால்|இல்லை|ஆக|ஒவ்வொன்றாக|இல்|வரை|செய்|முடியேனில்|பின்கொடு|முடி|நிரல்பாகம்|தொடர்|நிறுத்து|நிரல்பாகம்', Keyword),
+ ],
+ 'identifier': [
+ (u'(?:'+_TALETTERS+u')(?:[0-9]|'+_TALETTERS+u')*', Name),
+ ],
+ 'literal': [
+ (r'".*?"', String),
+ (r'(?u)\d+((\.\d*)?[eE][+-]?\d+|\.\d*)', Number.Float),
+ (r'(?u)\d+', Number.Integer),
+ ]
+ }
+
+ def __init__(self, **options):
+ super(EzhilLexer, self).__init__(**options)
+ self.encoding = options.get('encoding', 'utf-8')
diff --git a/tests/examplefiles/ezhil_primefactors.n b/tests/examplefiles/ezhil_primefactors.n
new file mode 100644
index 00000000..13390611
--- /dev/null
+++ b/tests/examplefiles/ezhil_primefactors.n
@@ -0,0 +1,152 @@
+# (C) முத்தையா அண்ணாமலை 2013
+# (A) என். சொக்கன்
+# எழில் தமிழ் நிரலாக்க மொழி உதாரணம்
+# Muthu A granted permission for this to be included under the BSD license
+# https://bitbucket.org/birkenfeld/pygments-main/pull-requests/443/ezhil-language-lexer-for-pygments/diff
+
+## Prime Factors Example
+## பகா எண் கூறுகளைக் கண்டறியும் உதாரணம்
+
+## இது நிரல் தரப்பட்ட எண்ணின் பகாஎண் கூறுகளைக் கண்டறியும்
+
+நிரல்பாகம் பகாஎண்ணா(எண்1)
+
+ ## இது நிரல்பாகம் தரப்பட்ட எண் பகு எண்ணா அல்லது பகா எண்ணா என்று கண்டறிந்து சொல்லும்
+ ## பகுஎண் என்றால் 0 திரும்பத் தரப்படும்
+ ## பகாஎண் என்றால் 1 திரும்பத் தரப்படும்
+
+ @(எண்1 < 0) ஆனால்
+
+ ## எதிர்மறை எண்களை நேராக்குதல்
+
+ எண்1 = எண்1 * (-1)
+
+ முடி
+
+ @(எண்1 < 2) ஆனால்
+
+ ## பூஜ்ஜியம், ஒன்று ஆகியவை பகா எண்கள் அல்ல
+
+ பின்கொடு 0
+
+ முடி
+
+ @(எண்1 == 2) ஆனால்
+
+ ## இரண்டு என்ற எண் ஒரு பகா எண்
+
+ பின்கொடு 1
+
+ முடி
+
+ மீதம் = எண்1%2
+
+ @(மீதம் == 0) ஆனால்
+
+ ## இரட்டைப்படை எண், ஆகவே, இது பகா எண் அல்ல
+
+ பின்கொடு 0
+
+ முடி
+
+ எண்1வர்க்கமூலம் = எண்1^0.5
+
+ @(எண்2 = 3, எண்2 <= எண்1வர்க்கமூலம், எண்2 = எண்2 + 2) ஆக
+
+ மீதம்1 = எண்1%எண்2
+
+ @(மீதம்1 == 0) ஆனால்
+
+ ## ஏதேனும் ஓர் எண்ணால் முழுமையாக வகுபட்டுவிட்டது, ஆகவே அது பகா எண் அல்ல
+
+ பின்கொடு 0
+
+ முடி
+
+ முடி
+
+ பின்கொடு 1
+
+முடி
+
+நிரல்பாகம் பகுத்தெடு(எண்1)
+
+ ## இது எண் தரப்பட்ட எண்ணின் பகா எண் கூறுகளைக் கண்டறிந்து பட்டியல் இடும்
+
+ கூறுகள் = பட்டியல்()
+
+ @(எண்1 < 0) ஆனால்
+
+ ## எதிர்மறை எண்களை நேராக்குதல்
+
+ எண்1 = எண்1 * (-1)
+
+ முடி
+
+ @(எண்1 <= 1) ஆனால்
+
+ ## ஒன்று அல்லது அதற்குக் குறைவான எண்களுக்குப் பகா எண் விகிதம் கண்டறியமுடியாது
+
+ பின்கொடு கூறுகள்
+
+ முடி
+
+ @(பகாஎண்ணா(எண்1) == 1) ஆனால்
+
+ ## தரப்பட்ட எண்ணே பகா எண்ணாக அமைந்துவிட்டால், அதற்கு அதுவே பகாஎண் கூறு ஆகும்
+
+ பின்இணை(கூறுகள், எண்1)
+ பின்கொடு கூறுகள்
+
+ முடி
+
+ தாற்காலிகஎண் = எண்1
+
+ எண்2 = 2
+
+ @(எண்2 <= தாற்காலிகஎண்) வரை
+
+ விடை1 = பகாஎண்ணா(எண்2)
+ மீண்டும்தொடங்கு = 0
+
+ @(விடை1 == 1) ஆனால்
+
+ விடை2 = தாற்காலிகஎண்%எண்2
+
+ @(விடை2 == 0) ஆனால்
+
+ ## பகா எண்ணால் முழுமையாக வகுபட்டுள்ளது, அதனைப் பட்டியலில் இணைக்கிறோம்
+
+ பின்இணை(கூறுகள், எண்2)
+ தாற்காலிகஎண் = தாற்காலிகஎண்/எண்2
+
+ ## மீண்டும் இரண்டில் தொடங்கி இதே கணக்கிடுதலைத் தொடரவேண்டும்
+
+ எண்2 = 2
+ மீண்டும்தொடங்கு = 1
+
+ முடி
+
+ முடி
+
+ @(மீண்டும்தொடங்கு == 0) ஆனால்
+
+ ## அடுத்த எண்ணைத் தேர்ந்தெடுத்துக் கணக்கிடுதலைத் தொடரவேண்டும்
+
+ எண்2 = எண்2 + 1
+
+ முடி
+
+ முடி
+
+ பின்கொடு கூறுகள்
+
+முடி
+
+அ = int(உள்ளீடு("உங்களுக்குப் பிடித்த ஓர் எண்ணைத் தாருங்கள்: "))
+
+பகாஎண்கூறுகள் = பட்டியல்()
+
+பகாஎண்கூறுகள் = பகுத்தெடு(அ)
+
+பதிப்பி "நீங்கள் தந்த எண்ணின் பகா எண் கூறுகள் இவை: ", பகாஎண்கூறுகள்
diff --git a/tests/test_ezhil.py b/tests/test_ezhil.py
new file mode 100644
index 00000000..23b9cb41
--- /dev/null
+++ b/tests/test_ezhil.py
@@ -0,0 +1,182 @@
+# -*- coding: utf-8 -*-
+"""
+ Basic EzhilLexer Test
+ ~~~~~~~~~~~~~~~~~~~~
+
+ :copyright: Copyright 2015 Muthiah Annamalai <ezhillang@gmail.com>
+ :license: BSD, see LICENSE for details.
+"""
+
+import unittest
+
+from pygments.token import Operator, Number, Text, Token
+from pygments.lexers import EzhilLexer
+
+
+class EzhilTest(unittest.TestCase):
+
+ def setUp(self):
+ self.lexer = EzhilLexer()
+ self.maxDiff = None
+
+ def testSum(self):
+ fragment = u'1+3\n'
+ tokens = [
+ (Number.Integer, u'1'),
+ (Operator, u'+'),
+ (Number.Integer, u'3'),
+ (Text, u'\n'),
+ ]
+ self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+
+ def testGCDExpr(self):
+ fragment = u'1^3+(5-5)*gcd(a,b)\n'
+ tokens = [
+ (Token.Number.Integer,u'1'),
+ (Token.Operator,u'^'),
+ (Token.Literal.Number.Integer, u'3'),
+ (Token.Operator, u'+'),
+ (Token.Punctuation, u'('),
+ (Token.Literal.Number.Integer, u'5'),
+ (Token.Operator, u'-'),
+ (Token.Literal.Number.Integer, u'5'),
+ (Token.Punctuation, u')'),
+ (Token.Operator, u'*'),
+ (Token.Name, u'gcd'),
+ (Token.Punctuation, u'('),
+ (Token.Name, u'a'),
+ (Token.Operator, u','),
+ (Token.Name, u'b'),
+ (Token.Punctuation, u')'),
+ (Token.Text, u'\n')
+ ]
+ self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+
+ def testIfStatement(self):
+ fragment = u"""@( 0 > 3 ) ஆனால்
+ பதிப்பி "wont print"
+முடி"""
+ tokens = [
+ (Token.Operator, u'@'),
+ (Token.Punctuation, u'('),
+ (Token.Text, u' '),
+ (Token.Literal.Number.Integer,u'0'),
+ (Token.Text, u' '),
+ (Token.Operator,u'>'),
+ (Token.Text, u' '),
+ (Token.Literal.Number.Integer, u'3'),
+ (Token.Text, u' '),
+ (Token.Punctuation, u')'),
+ (Token.Text, u' '),
+ (Token.Keyword, u'ஆனால்'),
+ (Token.Text, u'\n'),
+ (Token.Text, u'\t'),
+ (Token.Keyword, u'பதிப்பி'),
+ (Token.Text, u' '),
+ (Token.Literal.String, u'"wont print"'),
+ (Token.Text, u'\t'),
+ (Token.Text, u'\n'),
+ (Token.Keyword, u'முடி'),
+ (Token.Text, u'\n')
+ ]
+ self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+
+ def testFunction(self):
+ fragment = u"""# (C) முத்தையா அண்ணாமலை 2013, 2015
+நிரல்பாகம் gcd ( x, y )
+ மு = max(x,y)
+ q = min(x,y)
+
+ @( q == 0 ) ஆனால்
+ பின்கொடு மு
+ முடி
+ பின்கொடு gcd( மு - q , q )
+முடி\n"""
+ tokens = [
+ (Token.Comment.Single,
+ u'# (C) \u0bae\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8\u0baf\u0bbe \u0b85\u0ba3\u0bcd\u0ba3\u0bbe\u0bae\u0bb2\u0bc8 2013, 2015\n'),
+ (Token.Keyword,u'நிரல்பாகம்'),
+ (Token.Text, u' '),
+ (Token.Name, u'gcd'),
+ (Token.Text, u' '),
+ (Token.Punctuation, u'('),
+ (Token.Text, u' '),
+ (Token.Name, u'x'),
+ (Token.Operator, u','),
+ (Token.Text, u' '),
+ (Token.Name, u'y'),
+ (Token.Text, u' '),
+ (Token.Punctuation, u')'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Name, u'\u0bae\u0bc1'),
+ (Token.Text, u' '),
+ (Token.Operator, u'='),
+ (Token.Text, u' '),
+ (Token.Name.Builtin, u'max'),
+ (Token.Punctuation, u'('),
+ (Token.Name, u'x'),
+ (Token.Operator, u','),
+ (Token.Name, u'y'),
+ (Token.Punctuation, u')'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Name, u'q'),
+ (Token.Text, u' '),
+ (Token.Operator, u'='),
+ (Token.Text, u' '),
+ (Token.Name.Builtin, u'min'),
+ (Token.Punctuation, u'('),
+ (Token.Name, u'x'),
+ (Token.Operator, u','),
+ (Token.Name, u'y'),
+ (Token.Punctuation, u')'),
+ (Token.Text, u'\n'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Operator, u'@'),
+ (Token.Punctuation, u'('),
+ (Token.Text, u' '),
+ (Token.Name, u'q'),
+ (Token.Text, u' '),
+ (Token.Operator, u'=='),
+ (Token.Text, u' '),
+ (Token.Literal.Number.Integer, u'0'),
+ (Token.Text, u' '),
+ (Token.Punctuation, u')'),
+ (Token.Text, u' '),
+ (Token.Keyword, u'ஆனால்'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Keyword, u'பின்கொடு'),
+ (Token.Text, u' '),
+ (Token.Name, u'\u0bae\u0bc1'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Keyword, u'முடி'),
+ (Token.Text, u'\n'),
+ (Token.Text, u' '),
+ (Token.Keyword, u'\u0baa\u0bbf\u0ba9\u0bcd\u0b95\u0bca\u0b9f\u0bc1'),
+ (Token.Text, u' '),
+ (Token.Name, u'gcd'),
+ (Token.Punctuation, u'('),
+ (Token.Text, u' '),
+ (Token.Name, u'\u0bae\u0bc1'),
+ (Token.Text, u' '),
+ (Token.Operator, u'-'),
+ (Token.Text, u' '),
+ (Token.Name, u'q'),
+ (Token.Text, u' '),
+ (Token.Operator, u','),
+ (Token.Text, u' '),
+ (Token.Name, u'q'),
+ (Token.Text, u' '),
+ (Token.Punctuation, u')'),
+ (Token.Text, u'\n'),
+ (Token.Keyword, u'முடி'), #u'\u0bae\u0bc1\u0b9f\u0bbf'),
+ (Token.Text, u'\n')
+ ]
+ self.assertEqual(tokens, list(self.lexer.get_tokens(fragment)))
+
+if __name__ == "__main__":
+ unittest.main()