added syntax field array attribute
This commit is contained in:
parent
65be0d52bf
commit
508cd1793e
3 changed files with 29 additions and 7 deletions
|
|
@ -20,10 +20,15 @@ calc_grammar = """
|
||||||
|
|
||||||
?start: statement*
|
?start: statement*
|
||||||
|
|
||||||
?statement: NAME "=" sum -> assign_var
|
?statement: NAME [ "(" [attr_list] ")" ] "=" sum -> assign_var
|
||||||
| avg "{" [NAME ("," NAME)*] "}" -> assign_avg_var
|
| avg "{" [NAME ("," NAME)*] "}" -> assign_avg_var
|
||||||
| varlist
|
| varlist
|
||||||
|
|
||||||
|
?attr_list: attr_pair ("," attr_pair)*
|
||||||
|
|
||||||
|
?attr_pair: NAME "=" NAME
|
||||||
|
| NAME "=" INT
|
||||||
|
|
||||||
?sum: product
|
?sum: product
|
||||||
| sum "+" product -> add
|
| sum "+" product -> add
|
||||||
| sum "-" product -> sub
|
| sum "-" product -> sub
|
||||||
|
|
@ -63,6 +68,7 @@ calc_grammar = """
|
||||||
|
|
||||||
%import common.CNAME -> NAME
|
%import common.CNAME -> NAME
|
||||||
%import common.NUMBER
|
%import common.NUMBER
|
||||||
|
%import common.INT
|
||||||
%import common.WS
|
%import common.WS
|
||||||
|
|
||||||
COMMENT: /#.*/
|
COMMENT: /#.*/
|
||||||
|
|
@ -71,6 +77,10 @@ calc_grammar = """
|
||||||
%ignore WS
|
%ignore WS
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def tok_to_int(tok):
|
||||||
|
"Convert the value of `tok` from string to int, while maintaining line number & column."
|
||||||
|
# tok.type == 'INT'
|
||||||
|
return Token.new_borrow_pos(tok.type, int(tok), tok)
|
||||||
|
|
||||||
class VersionInfo(object):
|
class VersionInfo(object):
|
||||||
|
|
||||||
|
|
@ -112,7 +122,7 @@ class VersionInfo(object):
|
||||||
|
|
||||||
def test(terms_raw, report=False):
|
def test(terms_raw, report=False):
|
||||||
|
|
||||||
tree = Lark(calc_grammar, parser='lalr' ).parse(terms_raw)
|
tree = Lark(calc_grammar, parser='lalr', lexer_callbacks = {'INT': tok_to_int}).parse(terms_raw)
|
||||||
|
|
||||||
ir1 = Stage1(tree)
|
ir1 = Stage1(tree)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,11 +14,22 @@ class CollectDefinitions(Visitor):
|
||||||
self.derived[v.value] = PrimaryField(v.value, self.derived)
|
self.derived[v.value] = PrimaryField(v.value, self.derived)
|
||||||
|
|
||||||
def assign_var (self, tree):
|
def assign_var (self, tree):
|
||||||
|
if len(tree.children) > 2:
|
||||||
|
lval, lattr, rval = tree.children
|
||||||
|
else:
|
||||||
lval, rval = tree.children
|
lval, rval = tree.children
|
||||||
|
lattr = None
|
||||||
|
|
||||||
|
attr_dict = {}
|
||||||
|
|
||||||
|
if lattr is not None:
|
||||||
|
for t in lattr.children:
|
||||||
|
k, v = t.children
|
||||||
|
attr_dict[k.value] = v.value
|
||||||
|
|
||||||
if lval.value in self.derived:
|
if lval.value in self.derived:
|
||||||
raise StandardError("duplicate definition of " + lval)
|
raise StandardError("duplicate definition of " + lval)
|
||||||
self.derived[lval.value] = Field(lval.value, rval, self.derived)
|
self.derived[lval.value] = Field(lval.value, attr_dict, rval, self.derived)
|
||||||
|
|
||||||
def assign_avg_var (self, tree):
|
def assign_avg_var (self, tree):
|
||||||
w = tree.children[0]
|
w = tree.children[0]
|
||||||
|
|
@ -205,8 +216,9 @@ class FieldBase (object):
|
||||||
|
|
||||||
class Field (FieldBase):
|
class Field (FieldBase):
|
||||||
|
|
||||||
def __init__ (self, name, exp, fdict):
|
def __init__ (self, name, attr, exp, fdict):
|
||||||
super(Field,self).__init__(name, fdict)
|
super(Field,self).__init__(name, fdict)
|
||||||
|
self.attr = attr
|
||||||
self.exp = exp
|
self.exp = exp
|
||||||
self.fluc, self.dep, self.derivs = ExpInspector.inspect(exp)
|
self.fluc, self.dep, self.derivs = ExpInspector.inspect(exp)
|
||||||
self.comment = ExpToCode(self.fdict).transform(self.exp)
|
self.comment = ExpToCode(self.fdict).transform(self.exp)
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@
|
||||||
|
|
||||||
c = 1.0 - y
|
c = 1.0 - y
|
||||||
|
|
||||||
fsd = sqrt (sqr(ddx(c)) + sqr(ddy(c)) + sqr(ddz(c)))
|
fsd () = sqrt (sqr(ddx(c)) + sqr(ddy(c)) + sqr(ddz(c)))
|
||||||
|
|
||||||
nx = - ddx(c) / fsd
|
nx = - ddx(c) / fsd
|
||||||
ny = - ddy(c) / fsd
|
ny = - ddy(c) / fsd
|
||||||
nz = - ddz(c) / fsd
|
nz = - ddz(c) / fsd
|
||||||
|
|
||||||
divn = ddx(nx) + ddy(ny) + ddz(nz)
|
divn (a=1, b=kill, xlow=128, xupp=320) = ddx(nx) + ddy(ny) + ddz(nz)
|
||||||
|
|
||||||
avg { c, fsd, divn }
|
avg { c, fsd, divn }
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue