12632Sstever@eecs.umich.edu# -----------------------------------------------------------------------------
22632Sstever@eecs.umich.edu# hedit.py
32632Sstever@eecs.umich.edu#
42632Sstever@eecs.umich.edu# Paring of Fortran H Edit descriptions (Contributed by Pearu Peterson)
52632Sstever@eecs.umich.edu#
62632Sstever@eecs.umich.edu# These tokens can't be easily tokenized because they are of the following
72632Sstever@eecs.umich.edu# form:
82632Sstever@eecs.umich.edu#
92632Sstever@eecs.umich.edu#   nHc1...cn
102632Sstever@eecs.umich.edu#
112632Sstever@eecs.umich.edu# where n is a positive integer and c1 ... cn are characters.
122632Sstever@eecs.umich.edu#
132632Sstever@eecs.umich.edu# This example shows how to modify the state of the lexer to parse
142632Sstever@eecs.umich.edu# such tokens
152632Sstever@eecs.umich.edu# -----------------------------------------------------------------------------
164479Sbinkertn@umich.eduimport sys
176498Snate@binkert.orgif ".." not in sys.path: sys.path.insert(0,"..")
184479Sbinkertn@umich.edu
194479Sbinkertn@umich.eduimport ply.lex as lex
202632Sstever@eecs.umich.edu
212632Sstever@eecs.umich.edutokens = (
222632Sstever@eecs.umich.edu    'H_EDIT_DESCRIPTOR',
232632Sstever@eecs.umich.edu    )
242632Sstever@eecs.umich.edu
252632Sstever@eecs.umich.edu# Tokens
262632Sstever@eecs.umich.edut_ignore = " \t\n"
272632Sstever@eecs.umich.edu
282632Sstever@eecs.umich.edudef t_H_EDIT_DESCRIPTOR(t):
292632Sstever@eecs.umich.edu    r"\d+H.*"                     # This grabs all of the remaining text
302632Sstever@eecs.umich.edu    i = t.value.index('H')
312632Sstever@eecs.umich.edu    n = eval(t.value[:i])
326498Snate@binkert.org
332632Sstever@eecs.umich.edu    # Adjust the tokenizing position
342632Sstever@eecs.umich.edu    t.lexer.lexpos -= len(t.value) - (i+1+n)
352632Sstever@eecs.umich.edu    t.value = t.value[i+1:i+1+n]
366498Snate@binkert.org    return t
376498Snate@binkert.org
382632Sstever@eecs.umich.edudef t_error(t):
396498Snate@binkert.org    print("Illegal character '%s'" % t.value[0])
404479Sbinkertn@umich.edu    t.lexer.skip(1)
416498Snate@binkert.org
422632Sstever@eecs.umich.edu# Build the lexer
432632Sstever@eecs.umich.edulex.lex()
442632Sstever@eecs.umich.edulex.runmain(data="3Habc 10Habcdefghij 2Hxy")
452632Sstever@eecs.umich.edu
462632Sstever@eecs.umich.edu
472632Sstever@eecs.umich.edu
48