My favorites | Sign in
Project Home Downloads Wiki Issues Source
Repository:
Checkout   Browse   Changes   Clones  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

# The contents of this file are subject to the Mozilla Public License
# (MPL) Version 1.1 (the "License"); you may not use this file except
# in compliance with the License. You may obtain a copy of the License
# at http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS"
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
# the License for the specific language governing rights and
# limitations under the License.
#
# The Original Code is LEPL (http://www.acooke.org/lepl)
# The Initial Developer of the Original Code is Andrew Cooke.
# Portions created by the Initial Developer are Copyright (C) 2009-2010
# Andrew Cooke (andrew@acooke.org). All Rights Reserved.
#
# Alternatively, the contents of this file may be used under the terms
# of the LGPL license (the GNU Lesser General Public License,
# http://www.gnu.org/licenses/lgpl.html), in which case the provisions
# of the LGPL License are applicable instead of those above.
#
# If you wish to allow use of your version of this file only under the
# terms of the LGPL License and not to allow others to use your version
# of this file under the MPL, indicate your decision by deleting the
# provisions above and replace them with the notice and other provisions
# required by the LGPL License. If you do not delete the provisions
# above, a recipient may use your version of this file under either the
# MPL or the LGPL License.

'''
A simple Python-like language.
'''


# pylint: disable-msg=W0614, W0401, W0621, C0103, C0111, R0201, R0904
#@PydevCodeAnalysisIgnore

#from logging import basicConfig, DEBUG
from unittest import TestCase

from lepl import *
from lepl._example.support import Example


class PythonExample(Example):

def test_python(self):

word = Token(Word(Lower()))
continuation = Token(r'\\')
symbol = Token(Any('()'))
introduce = ~Token(':')
comma = ~Token(',')
hash = Token('#.*')

CLine = ContinuedBLineFactory(continuation)

statement = word[1:]
args = BExtend(word[:, comma]) > tuple
function = word[1:] & ~symbol('(') & args & ~symbol(')')

block = Delayed()
blank = ~BLine(Empty(), indent=False)
comment = ~BLine(hash, indent=False)
line = Or((CLine(statement) | block) > list,
blank,
comment)
block += CLine((function | statement) & introduce) & Block(line[1:])

program = (line[:] & Eos())
program.config.blocks(block_policy=explicit)
parser = program.get_parse_string()

result = parser('''
# this is a grammar with a similar
# line structure to python

if something:
then we indent
else:
something else
# note a different indent size here

def function(a, b, c):
we can nest blocks:
like this
and we can also \
have explicit continuations \
with \
any \
indentation

same for (argument,
lists):
which do not need the
continuation marker
# and we can have blank lines inside a block:

like this
# along with strangely placed comments
but still keep blocks tied together
''')
assert result == \
[
['if', 'something',
['then', 'we', 'indent']
],
['else',
['something', 'else'],
],
['def', 'function', ('a', 'b', 'c'),
['we', 'can', 'nest', 'blocks',
['like', 'this']
],
['and', 'we', 'can', 'also', 'have', 'explicit', 'continuations',
'with', 'any', 'indentation'],
],
['same', 'for', ('argument', 'lists'),
['which', 'do', 'not', 'need', 'the'],
['continuation', 'marker'],
['like', 'this'],
['but', 'still', 'keep', 'blocks', 'tied', 'together']
]
], result

Change log

13a59b816b7c by andrew on Mar 18, 2011   Diff
delete old offside stuff
Go to: 
Project members, sign in to write a code review

Older revisions

All revisions of this file

File info

Size: 3970 bytes, 124 lines
Powered by Google Project Hosting