mirror of https://gerrit.osmocom.org/pysim
56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
from lark import Lark, Transformer, Token, Tree
|
|
from script_format import ScriptFormat
|
|
from format_ldr import LdrXfrm
|
|
|
|
class IprXfrm(LdrXfrm):
|
|
""" transform the parse tree into a more easily consumable form """
|
|
def key(self, items):
|
|
return ('key', ''.join(list(items)))
|
|
def req(self, items):
|
|
return items[:-1]
|
|
def rsp(self, items):
|
|
return items[:-1]
|
|
#def NEWLINE(self, items):
|
|
#return None
|
|
|
|
|
|
class ScriptFormatIPR(ScriptFormat):
|
|
# parser for the IPR file format as used by the SIM card factory
|
|
ipr_parser = Lark(r"""
|
|
script: statement*
|
|
?statement: cmd | rst | rem | NEWLINE
|
|
|
|
NONL: /[^\n]/+
|
|
rem: "//" NONL? NEWLINE
|
|
|
|
ALNUM: DIGIT | LETTER | "_"
|
|
key: "[" ALNUM+ "]"
|
|
|
|
cmd: req rsp
|
|
|
|
req: "I:" [hexstr|key]+ NEWLINE
|
|
hexstr: HEX_ITEM+
|
|
HEX_ITEM: HEXDIGIT ~ 2
|
|
|
|
rsp: "O:" swpattern? NEWLINE
|
|
swpattern: HEX_OR_X ~ 4
|
|
HEX_OR_X: HEXDIGIT | "X" | "x"
|
|
|
|
rst: "RESET" NEWLINE
|
|
|
|
%import common.ESCAPED_STRING -> STRING
|
|
%import common.WS_INLINE
|
|
%import common.HEXDIGIT
|
|
%import common.DIGIT
|
|
%import common.LETTER
|
|
%import common.NEWLINE
|
|
%ignore WS_INLINE
|
|
|
|
""", start='script', parser='lalr')#, lexer='standard')
|
|
|
|
def parse_xform(self, text):
|
|
tree = self.ipr_parser.parse(text)
|
|
#print(tree.pretty())
|
|
p = IprXfrm().transform(tree)
|
|
return p
|