Browse Source

fix clangd

rlbr-dev
Larry Xue 5 years ago
parent
commit
e475cfad32
  1. 10
      c2logic/compiler.py
  2. 17
      c2logic/instructions.py
  3. 2
      compile_flags.txt
  4. 5
      examples/control_flow.c
  5. 2
      examples/funcs.c

10
c2logic/compiler.py

@ -1,5 +1,5 @@
from pycparser.c_ast import Compound, Constant, DeclList, Enum, FileAST, FuncDecl, Struct, TypeDecl from pycparser.c_ast import Compound, Constant, DeclList, Enum, FileAST, FuncDecl, Struct, TypeDecl
from .instructions import BinaryOp, Enable, JumpCondition, Print, PrintFlush, Radar, RawAsm, RelativeJump, Sensor, Shoot, UnaryOp, Instruction, Set, Noop
from .instructions import BinaryOp, Enable, End, JumpCondition, Print, PrintFlush, Radar, RawAsm, RelativeJump, Sensor, Shoot, UnaryOp, Instruction, Set, Noop
from pycparser import c_ast, parse_file from pycparser import c_ast, parse_file
from dataclasses import dataclass from dataclasses import dataclass
@ -193,7 +193,7 @@ class Compiler(c_ast.NodeVisitor):
self.visit(node.iftrue) self.visit(node.iftrue)
#jump over else body from end of if body #jump over else body from end of if body
if node.iffalse is not None: if node.iffalse is not None:
self.push(RelativeJump(None, JumpCondition("==", "0", "0")))
self.push(RelativeJump(None, JumpCondition.always))
cond_jump_offset2 = len(self.curr_function.instructions) - 1 cond_jump_offset2 = len(self.curr_function.instructions) - 1
self.curr_function.instructions[cond_jump_offset].offset = len( self.curr_function.instructions[cond_jump_offset].offset = len(
self.curr_function.instructions self.curr_function.instructions
@ -205,11 +205,12 @@ class Compiler(c_ast.NodeVisitor):
) )
def visit_Break(self, node): def visit_Break(self, node):
self.push(RelativeJump(None, JumpCondition("==", "0", "0")))
self.push(RelativeJump(None, JumpCondition.always))
self.loop_end_jumps.append(len(self.curr_function.instructions) - 1) self.loop_end_jumps.append(len(self.curr_function.instructions) - 1)
def visit_FuncCall(self, node): def visit_FuncCall(self, node):
name = node.name.name name = node.name.name
#TODO avoid duplication in psuedo-function calls
if name == "_asm": if name == "_asm":
arg = node.args.exprs[0] arg = node.args.exprs[0]
if not isinstance(arg, Constant) or arg.type != "string": if not isinstance(arg, Constant) or arg.type != "string":
@ -283,7 +284,8 @@ class Compiler(c_ast.NodeVisitor):
else: else:
break break
self.push(Shoot(*args)) #pylint: disable=no-value-for-parameter self.push(Shoot(*args)) #pylint: disable=no-value-for-parameter
elif name == "end":
self.push(End())
else: else:
raise NotImplementedError(node) raise NotImplementedError(node)

17
c2logic/instructions.py

@ -1,3 +1,4 @@
from dataclasses import dataclass
from .operations import binary_ops, condition_ops, unary_ops from .operations import binary_ops, condition_ops, unary_ops
class Instruction: class Instruction:
@ -34,19 +35,21 @@ class UnaryOp(Instruction):
def __str__(self): def __str__(self):
return f"uop {unary_ops[self.op]} {self.src} {self.dest}" return f"uop {unary_ops[self.op]} {self.src} {self.dest}"
@dataclass
class JumpCondition: class JumpCondition:
def __init__(self, op: str, left, right):
self.op = op
self.left = left
self.right = right
op: str
left: str
right: str
@classmethod @classmethod
def from_binaryop(cls, binop: BinaryOp): def from_binaryop(cls, binop: BinaryOp):
return JumpCondition(binop.op, binop.left, binop.right)
return cls(binop.op, binop.left, binop.right)
def __str__(self): def __str__(self):
return f"{condition_ops[self.op]} {self.left} {self.right}" return f"{condition_ops[self.op]} {self.left} {self.right}"
JumpCondition.always = JumpCondition("==", "0", "0")
class RelativeJump(Instruction): class RelativeJump(Instruction):
def __init__(self, offset: int, cond: JumpCondition): def __init__(self, offset: int, cond: JumpCondition):
self.offset = offset self.offset = offset
@ -110,6 +113,10 @@ class Shoot(Instruction):
def __str__(self): def __str__(self):
return f"control shoot {self.obj} {self.x} {self.y} {self.shoot} 0" return f"control shoot {self.obj} {self.x} {self.y} {self.shoot} 0"
class End(Instruction):
def __str__(self):
return "end"
class RawAsm(Instruction): class RawAsm(Instruction):
def __init__(self, code: str): def __init__(self, code: str):
self.code = code self.code = code

2
compile_flags.txt

@ -1,4 +1,4 @@
-I ./include -I ./include
-Wall -Wall
-Wextra -Wextra
-std=c11
-Wno-main-return-type

5
examples/control_flow.c

@ -1,10 +1,13 @@
#include "mindustry.h"
#include "../include/mindustry.h"
extern struct MindustryObject message1; extern struct MindustryObject message1;
void main(void) { void main(void) {
double i = 0; double i = 0;
while (i < 10) { while (i < 10) {
printd(i); printd(i);
i++; i++;
if (i == 4) {
break;
}
} }
print("\n"); print("\n");
i = 0; i = 0;

2
examples/funcs.c

@ -1,4 +1,4 @@
#include "mindustry.h"
#include "../include/mindustry.h"
extern struct MindustryObject message1; extern struct MindustryObject message1;
extern struct MindustryObject swarmer1; extern struct MindustryObject swarmer1;
extern struct MindustryObject conveyor1; extern struct MindustryObject conveyor1;

Loading…
Cancel
Save