diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2013-01-27 22:18:40 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2013-01-27 22:18:40 +0200 |
commit | aef5ef362d5f0934df44951d20028b64e5529384 (patch) | |
tree | 3d4e3c75595eebf2161633c80fc9fc540dfb928e | |
parent | d4d8045d2ef18b0c3131572a970e25816d633de1 (diff) | |
download | meson-aef5ef362d5f0934df44951d20028b64e5529384.zip meson-aef5ef362d5f0934df44951d20028b64e5529384.tar.gz meson-aef5ef362d5f0934df44951d20028b64e5529384.tar.bz2 |
Added support for numbers.
-rwxr-xr-x | bparser.py | 10 | ||||
-rwxr-xr-x | interpreter.py | 25 | ||||
-rw-r--r-- | nodes.py | 23 | ||||
-rw-r--r-- | test cases/25 numbers/builder.txt | 7 | ||||
-rw-r--r-- | test cases/25 numbers/prog.c | 10 |
5 files changed, 66 insertions, 9 deletions
@@ -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''' diff --git a/interpreter.py b/interpreter.py index 3194028..74689a2 100755 --- a/interpreter.py +++ b/interpreter.py @@ -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.') diff --git a/test cases/25 numbers/builder.txt b/test cases/25 numbers/builder.txt new file mode 100644 index 0000000..557408a --- /dev/null +++ b/test cases/25 numbers/builder.txt @@ -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')) diff --git a/test cases/25 numbers/prog.c b/test cases/25 numbers/prog.c new file mode 100644 index 0000000..d4c7872 --- /dev/null +++ b/test cases/25 numbers/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; +} |