def testMessage(self): self.check('1 :: "abc"', Node("MessageName", Number("1"), String("abc"))) self.check( '1 :: "abc" :: "123"', Node("MessageName", Number("1"), String("abc"), String("123")), )
def testRow(self): self.check('\\( \\)', String("")) self.check('\\( a \\)', String("a")) self.check('\\( \\@ a \\_ b \\)', 'SqrtBox[SubscriptBox["a", "b"]]') self.check('\\( a + b \\)', 'RowBox[List["a", "+", "b"]]') self.check('\\(a \\^ b \\+ c\\)', 'SuperscriptBox["a", UnderscriptBox["b", "c"]]') self.check('\\(a \\+ b \\^ c\\)', 'SuperscriptBox[UnderscriptBox["a", "b"], "c"]')
def testString(self): self.check(r'"abc"', String("abc")) self.incomplete_error(r'"abc') self.check(r'"abc(*def*)"', String("abc(*def*)")) self.check(r'"a\"b\\c"', String(r"a\"b\\c")) self.incomplete_error(r'"\"') self.invalid_error(r'\""')
def parse_box(self, p): result = None while True: token = self.next() tag = token.tag method = getattr(self, "b_" + tag, None) if method is not None: new_result = method(result, token, p) elif tag in ("OtherscriptBox", "RightRowBox"): break elif tag == "END": self.incomplete(token.pos) elif result is None and tag != "END": self.consume() new_result = String(token.text) if new_result.value == r"\(": new_result = self.p_LeftRowBox(token) else: new_result = None if new_result is None: break else: result = new_result if result is None: result = String("") return result
def b_FractionBox(self, box1, token, p): q = misc_ops['FractionBox'] if q < p: return None if box1 is None: box1 = String('') self.consume() box2 = self.parse_box(q + 1) return Node('FractionBox', box1, box2)
def p_LeftRowBox(self, token): self.consume() children = [] self.box_depth += 1 self.bracket_depth += 1 token = self.next() while token.tag not in ('RightRowBox', 'OtherscriptBox'): children.append(self.parse_box(0)) token = self.next() if len(children) == 0: result = String('') elif len(children) == 1: result = children[0] else: result = Node('RowBox', Node('List', *children)) self.expect('RightRowBox') self.box_depth -= 1 self.bracket_depth -= 1 result.parenthesised = True return result
def p_Slot(self, token): self.consume() text = token.text if len(text) == 1: n = Number('1') else: n = text[1:] if n.isdigit(): n = Number(n) else: n = String(n) return Node('Slot', n)
def p_LeftRowBox(self, token): self.consume() children = [] self.box_depth += 1 self.bracket_depth += 1 token = self.next() while token.tag not in ("RightRowBox", "OtherscriptBox"): newnode = self.parse_box(0) children.append(newnode) token = self.next() if len(children) == 0: result = String("") elif len(children) == 1: result = children[0] else: result = Node("RowBox", Node("List", *children)) self.expect("RightRowBox") self.box_depth -= 1 self.bracket_depth -= 1 result.parenthesised = True return result
def b_FormBox(self, box1, token, p): q = misc_ops['FormBox'] if q < p: return None if box1 is None: box1 = Symbol('StandardForm') # RawForm elif is_symbol_name(box1.value): box1 = Symbol(box1.value, context=None) else: box1 = Node('Removed', String('$$Failure')) self.consume() box2 = self.parse_box(q) return Node('FormBox', box2, box1)
def b_FormBox(self, box1, token, p): q = misc_ops["FormBox"] if q < p: return None if box1 is None: box1 = Symbol("StandardForm") # RawForm elif is_symbol_name(box1.value): box1 = Symbol(box1.value, context=None) else: box1 = Node("Removed", String("$$Failure")) self.consume() box2 = self.parse_box(q) return Node("FormBox", box2, box1)
def b_OverscriptBox(self, box1, token, p): q = misc_ops['OverscriptBox'] if q < p: return None if box1 is None: box1 = String('') self.consume() box2 = self.parse_box(q) if self.next().tag == 'OtherscriptBox': self.consume() box3 = self.parse_box(misc_ops['UnderoverscriptBox']) return Node('UnderoverscriptBox', box1, box3, box2) else: return Node('OverscriptBox', box1, box2)
def b_OverscriptBox(self, box1, token, p): q = misc_ops["OverscriptBox"] if q < p: return None if box1 is None: box1 = String("") self.consume() box2 = self.parse_box(q) if self.next().tag == "OtherscriptBox": self.consume() box3 = self.parse_box(misc_ops["UnderoverscriptBox"]) return Node("UnderoverscriptBox", box1, box3, box2) else: return Node("OverscriptBox", box1, box2)
def parse_box(self, p): result = None while True: token = self.next() tag = token.tag method = getattr(self, 'b_' + tag, None) if method is not None: new_result = method(result, token, p) elif tag in ('OtherscriptBox', 'RightRowBox'): break elif tag == 'END': self.incomplete(token.pos) elif result is None and tag != 'END': self.consume() new_result = String(token.text) else: new_result = None if new_result is None: break else: result = new_result if result is None: result = String('') return result
def e_MessageName(self, expr1, token, p): leaves = [expr1] while self.next().tag == 'MessageName': self.consume() token = self.next() if token.tag == 'Symbol': # silently convert Symbol to String self.consume() leaf = String(token.text) elif token.tag == 'String': leaf = self.p_String(token) else: self.tokeniser.sntx_message(token.pos) raise InvalidSyntaxError() leaves.append(leaf) return Node('MessageName', *leaves)
def p_String(self, token): result = String(token.text[1:-1]) self.consume() return result
def testMessage(self): self.check('1 :: "abc"', Node('MessageName', Number('1'), String("abc"))) self.check( '1 :: "abc" :: "123"', Node('MessageName', Number('1'), String("abc"), String("123")))