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 .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 dataclasses import dataclass
@ -193,7 +193,7 @@ class Compiler(c_ast.NodeVisitor):
self.visit(node.iftrue)
#jump over else body from end of if body
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
self.curr_function.instructions[cond_jump_offset].offset = len(
self.curr_function.instructions
@ -205,11 +205,12 @@ class Compiler(c_ast.NodeVisitor):
)
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)
def visit_FuncCall(self, node):
name = node.name.name
#TODO avoid duplication in psuedo-function calls
if name == "_asm":
arg = node.args.exprs[0]
if not isinstance(arg, Constant) or arg.type != "string":
@ -283,7 +284,8 @@ class Compiler(c_ast.NodeVisitor):
else:
break
self.push(Shoot(*args)) #pylint: disable=no-value-for-parameter
elif name == "end":
self.push(End())
else:
raise NotImplementedError(node)

17
c2logic/instructions.py

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

2
compile_flags.txt

@ -1,4 +1,4 @@
-I ./include
-Wall
-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;
void main(void) {
double i = 0;
while (i < 10) {
printd(i);
i++;
if (i == 4) {
break;
}
}
print("\n");
i = 0;

2
examples/funcs.c

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

Loading…
Cancel
Save