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*
|
||||
|
||||
?statement: NAME "=" sum -> assign_var
|
||||
?statement: NAME [ "(" [attr_list] ")" ] "=" sum -> assign_var
|
||||
| avg "{" [NAME ("," NAME)*] "}" -> assign_avg_var
|
||||
| varlist
|
||||
|
||||
?attr_list: attr_pair ("," attr_pair)*
|
||||
|
||||
?attr_pair: NAME "=" NAME
|
||||
| NAME "=" INT
|
||||
|
||||
?sum: product
|
||||
| sum "+" product -> add
|
||||
| sum "-" product -> sub
|
||||
|
|
@ -63,6 +68,7 @@ calc_grammar = """
|
|||
|
||||
%import common.CNAME -> NAME
|
||||
%import common.NUMBER
|
||||
%import common.INT
|
||||
%import common.WS
|
||||
|
||||
COMMENT: /#.*/
|
||||
|
|
@ -71,6 +77,10 @@ calc_grammar = """
|
|||
%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):
|
||||
|
||||
|
|
@ -112,7 +122,7 @@ class VersionInfo(object):
|
|||
|
||||
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)
|
||||
|
||||
|
|
|
|||
|
|
@ -14,11 +14,22 @@ class CollectDefinitions(Visitor):
|
|||
self.derived[v.value] = PrimaryField(v.value, self.derived)
|
||||
|
||||
def assign_var (self, tree):
|
||||
if len(tree.children) > 2:
|
||||
lval, lattr, rval = tree.children
|
||||
else:
|
||||
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:
|
||||
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):
|
||||
w = tree.children[0]
|
||||
|
|
@ -205,8 +216,9 @@ class FieldBase (object):
|
|||
|
||||
class Field (FieldBase):
|
||||
|
||||
def __init__ (self, name, exp, fdict):
|
||||
def __init__ (self, name, attr, exp, fdict):
|
||||
super(Field,self).__init__(name, fdict)
|
||||
self.attr = attr
|
||||
self.exp = exp
|
||||
self.fluc, self.dep, self.derivs = ExpInspector.inspect(exp)
|
||||
self.comment = ExpToCode(self.fdict).transform(self.exp)
|
||||
|
|
|
|||
|
|
@ -4,12 +4,12 @@
|
|||
|
||||
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
|
||||
ny = - ddy(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 }
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue