Added support for numbers.

pull/15/head
Jussi Pakkanen 12 years ago
parent d4d8045d2e
commit aef5ef362d
  1. 10
      bparser.py
  2. 25
      interpreter.py
  3. 23
      nodes.py
  4. 7
      test cases/25 numbers/builder.txt
  5. 10
      test cases/25 numbers/prog.c

@ -39,6 +39,7 @@ tokens = ['LPAREN',
'COMMA',
'DOT',
'STRING',
'INT',
'EOL_CONTINUE',
'EOL',
] + list(reserved.values())
@ -68,6 +69,11 @@ def t_STRING(t):
t.value = t.value[1:-1]
return t
def t_INT(t):
'[0-9]+'
t.value = int(t.value)
return t
def t_EOL(t):
r'\n'
t.lexer.lineno += 1
@ -103,6 +109,10 @@ def p_expression_atom(t):
'expression : ATOM'
t[0] = nodes.AtomExpression(t[1], t.lineno(1))
def p_expression_int(t):
'expression : INT'
t[0] = nodes.IntExpression(t[1], t.lineno(1))
def p_expression_bool(t):
'''expression : TRUE
| FALSE'''

@ -38,23 +38,26 @@ class InterpreterObject():
return self.methods[method_name](args)
raise InvalidCode('Unknown method "%s" in object.' % method_name)
# This currently returns data for the current environment.
# It should return info for the target host.
class Host(InterpreterObject):
def __init__(self):
InterpreterObject.__init__(self)
self.methods.update({'pointer_size' : self.get_ptrsize_method,
'name' : self.get_name_method,
'is_little_endian' : self.is_little_endian_method,
})
def get_ptrsize(self):
def get_ptrsize_method(self, args):
if sys.maxsize > 2**32:
return 64
return 32
def get_name(self):
def get_name_method(self, args):
return platform.system().lower()
def is_little_endian(self):
def is_little_endian_method(self, args):
return sys.byteorder == 'little'
class IncludeDirs(InterpreterObject):
@ -114,7 +117,7 @@ class ConfigureFile(InterpreterObject):
def get_subdir(self):
return self.subdir
def get_source_name(self):
return self.sourcename
@ -360,6 +363,8 @@ class Interpreter():
return self.evaluate_comparison(cur)
elif isinstance(cur, nodes.ArrayStatement):
return self.evaluate_arraystatement(cur)
elif isinstance(cur, nodes.IntStatement):
return cur
else:
raise InvalidCode("Line %d: Unknown statement." % cur.lineno())
@ -595,8 +600,14 @@ class Interpreter():
def evaluate_comparison(self, node):
v1 = self.evaluate_statement(node.get_first())
v2 = self.evaluate_statement(node.get_second())
val1 = v1.get_value()
val2 = v2.get_value()
if isinstance(v1, int):
val1 = v1
else:
val1 = v1.get_value()
if(isinstance(v2, int)):
val2 = v2
else:
val2 = v2.get_value()
assert(type(val1) == type(val2))
if node.get_ctype() == '==':
return val1 == val2

@ -49,12 +49,20 @@ class StringExpression(Expression):
Expression.__init__(self, lineno)
self.value = value
class IntExpression(Expression):
def __init__(self, value, lineno):
Expression.__init__(self, lineno)
self.value = value
def get_value(self):
return self.value
class AtomStatement(Statement):
def __init__(self, value, lineno):
Statement.__init__(self, lineno)
assert(type(value) == type(''))
self.value = value
def get_value(self):
return self.value
@ -66,7 +74,16 @@ class BoolStatement(Statement):
def get_value(self):
return self.value
class IntStatement(Statement):
def __init__(self, value, lineno):
Statement.__init__(self, lineno)
assert(isinstance(value, int))
self.value = value
def get_value(self):
return self.value
class IfStatement(Statement):
def __init__(self, clause, trueblock, falseblock, lineno):
Statement.__init__(self, lineno)
@ -167,4 +184,6 @@ def statement_from_expression(expr):
return StringStatement(expr.value, expr.lineno())
if isinstance(expr, BoolExpression):
return BoolStatement(expr.value, expr.lineno())
if isinstance(expr, IntExpression):
return IntStatement(expr.get_value(), expr.lineno())
raise RuntimeError('Can not convert unknown expression to a statement.')

@ -0,0 +1,7 @@
project('numbers', 'c')
if(host.pointer_size() == 64)
add_global_arguments('c', '-DIS64')
endif
add_test('sizetest', executable('prog', 'prog.c'))

@ -0,0 +1,10 @@
int main(int argc, char **argv) {
int ptrsize = sizeof(void*);
int expsize;
#ifdef IS64
expsize = 8;
#else
expsize = 4;
#endif
return ptrsize == expsize ? 0 : 1;
}
Loading…
Cancel
Save