7267
|
1 # -----------------------------------------------------------------------------
|
|
2 # hedit.py
|
|
3 #
|
|
4 # Paring of Fortran H Edit descriptions (Contributed by Pearu Peterson)
|
|
5 #
|
|
6 # These tokens can't be easily tokenized because they are of the following
|
|
7 # form:
|
|
8 #
|
|
9 # nHc1...cn
|
|
10 #
|
|
11 # where n is a positive integer and c1 ... cn are characters.
|
|
12 #
|
|
13 # This example shows how to modify the state of the lexer to parse
|
|
14 # such tokens
|
|
15 # -----------------------------------------------------------------------------
|
|
16 import sys
|
|
17 if ".." not in sys.path: sys.path.insert(0,"..")
|
|
18
|
|
19 import ply.lex as lex
|
|
20
|
|
21 tokens = (
|
|
22 'H_EDIT_DESCRIPTOR',
|
|
23 )
|
|
24
|
|
25 # Tokens
|
|
26 t_ignore = " \t\n"
|
|
27
|
|
28 def t_H_EDIT_DESCRIPTOR(t):
|
|
29 r"\d+H.*" # This grabs all of the remaining text
|
|
30 i = t.value.index('H')
|
|
31 n = eval(t.value[:i])
|
|
32
|
|
33 # Adjust the tokenizing position
|
|
34 t.lexer.lexpos -= len(t.value) - (i+1+n)
|
|
35 t.value = t.value[i+1:i+1+n]
|
|
36 return t
|
|
37
|
|
38 def t_error(t):
|
|
39 print("Illegal character '%s'" % t.value[0])
|
|
40 t.lexer.skip(1)
|
|
41
|
|
42 # Build the lexer
|
|
43 lex.lex()
|
|
44 lex.runmain(data="3Habc 10Habcdefghij 2Hxy")
|
|
45
|
|
46
|
|
47
|