| 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 |