Skip to content

Commit

Permalink
Change the ikc parser to not though retatching anymore, also remove o…
Browse files Browse the repository at this point in the history
…ld crufty Message.Type code
  • Loading branch information
olabini committed Oct 22, 2009
1 parent 907f4b2 commit 0db5b23
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 73 deletions.
14 changes: 1 addition & 13 deletions src/ikc/main/Ioke.Lang/Parser/IokeParser.cs
Expand Up @@ -999,18 +999,11 @@ public class IokeParser
m.Position = cc;
IokeObject mx = runtime.CreateMessage(m);

int rr2 = rr;
readWhiteSpace();
rr = peek();

if(rr == '(') {
read();
IList args = parseExpressionChain();
parseCharacter(')');
Message.SetArguments(mx, args);
if(rr != rr2) {
Message.SetType(mx, Message.Type.DETACH);
}
}
return mx;
}
Expand Down Expand Up @@ -1159,17 +1152,12 @@ public class IokeParser
m.Line = l;
m.Position = cc;
IokeObject mx = runtime.CreateMessage(m);
int rr2 = rr;
readWhiteSpace();
rr = peek();

if(rr == '(') {
read();
IList args = parseExpressionChain();
parseCharacter(')');
Message.SetArguments(mx, args);
if(rr != rr2) {
Message.SetType(mx, Message.Type.DETACH);
}
}

return mx;
Expand Down
8 changes: 4 additions & 4 deletions src/ikj/main/ioke/lang/DefinitionsBehavior.java
Expand Up @@ -41,7 +41,7 @@ public Object activate(IokeObject method, IokeObject context, IokeObject message
List<Object> args = message.getArguments();

if(args.size() == 0) {
final Message mx = new Message(context.runtime, "nil", null, Message.Type.MESSAGE);
final Message mx = new Message(context.runtime, "nil", null, false);
mx.setFile(Message.file(message));
mx.setLine(Message.line(message));
mx.setPosition(Message.position(message));
Expand Down Expand Up @@ -84,7 +84,7 @@ public Object activate(IokeObject method, IokeObject context, IokeObject message
List<Object> args = message.getArguments();

if(args.size() == 0) {
final Message mx = new Message(context.runtime, "nil", null, Message.Type.MESSAGE);
final Message mx = new Message(context.runtime, "nil", null, false);
mx.setFile(Message.file(message));
mx.setLine(Message.line(message));
mx.setPosition(Message.position(message));
Expand Down Expand Up @@ -125,7 +125,7 @@ public Object activate(IokeObject method, IokeObject context, IokeObject message
List<Object> args = message.getArguments();

if(args.size() == 0) {
final Message mx = new Message(context.runtime, "nil", null, Message.Type.MESSAGE);
final Message mx = new Message(context.runtime, "nil", null, false);
mx.setFile(Message.file(message));
mx.setLine(Message.line(message));
mx.setPosition(Message.position(message));
Expand Down Expand Up @@ -166,7 +166,7 @@ public Object activate(IokeObject method, IokeObject context, IokeObject message
List<Object> args = message.getArguments();

if(args.size() == 0) {
final Message mx = new Message(context.runtime, "nil", null, Message.Type.MESSAGE);
final Message mx = new Message(context.runtime, "nil", null, false);
mx.setFile(Message.file(message));
mx.setLine(Message.line(message));
mx.setPosition(Message.position(message));
Expand Down
2 changes: 1 addition & 1 deletion src/ikj/main/ioke/lang/LiteralsBehavior.java
Expand Up @@ -49,7 +49,7 @@ public Object activate(IokeObject method, IokeObject context, IokeObject message
Message m = new Message(context.runtime, name);
IokeObject ret = context.runtime.createMessage(m);
if(".".equals(name)) {
Message.setType(ret, Message.Type.TERMINATOR);
Message.setIsTerminator(ret, true);
}
Message.copySourceLocation(message, ret);
return ret;
Expand Down
2 changes: 1 addition & 1 deletion src/ikj/main/ioke/lang/Main.java
Expand Up @@ -32,7 +32,7 @@ public static void main(String[] args) throws Throwable {
Runtime r = new Runtime();
r.init();
final IokeObject context = r.ground;
final Message mx = new Message(r, ".", null, Message.Type.TERMINATOR);
final Message mx = new Message(r, ".", null, true);
mx.setLine(0);
mx.setPosition(0);
final IokeObject message = r.createMessage(mx);
Expand Down
39 changes: 17 additions & 22 deletions src/ikj/main/ioke/lang/Message.java
Expand Up @@ -20,13 +20,12 @@
* @author <a href="mailto:ola.bini@gmail.com">Ola Bini</a>
*/
public class Message extends IokeData {
public static enum Type {MESSAGE, DETACH, TERMINATOR, SEPARATOR, START_INTERPOLATION, START_RE_INTERPOLATION, END_INTERPOLATION, END_RE_INTERPOLATION, MIDDLE_INTERPOLATION, MIDDLE_RE_INTERPOLATION};
private boolean isTerminator;

private String name;
private String file;
private int line;
private int pos;
private Type type = Type.MESSAGE;

private List<Object> arguments = new ArrayList<Object>();

Expand All @@ -36,19 +35,19 @@ public static enum Type {MESSAGE, DETACH, TERMINATOR, SEPARATOR, START_INTERPOLA
private Object cached = null;

public Message(Runtime runtime, String name) {
this(runtime, name, null, Type.MESSAGE);
this(runtime, name, null, false);
}

Message(Runtime runtime, String name, Type type) {
this(runtime, name, null, type);
Message(Runtime runtime, String name, boolean isTerminator) {
this(runtime, name, null, isTerminator);
}

public Message(Runtime runtime, String name, Object arg1) {
this(runtime, name, arg1, Type.MESSAGE);
this(runtime, name, arg1, false);
}

public Message(Runtime runtime, String name, Object arg1, Type type) {
this.type = type;
public Message(Runtime runtime, String name, Object arg1, boolean isTerminator) {
this.isTerminator = isTerminator;
this.name = name;

this.file = ((IokeSystem)IokeObject.data(runtime.system)).currentFile();
Expand All @@ -73,7 +72,7 @@ public static Message wrap(String name, Object cachedResult, Runtime runtime) {
}

public static boolean isTerminator(Object message) {
return ((Message)IokeObject.data(message)).type == Type.TERMINATOR;
return ((Message)IokeObject.data(message)).isTerminator;
}

public static boolean isFirstOnLine(Object message) {
Expand Down Expand Up @@ -103,7 +102,7 @@ public static IokeObject deepCopy(Object message) throws ControlFlow {
Message orgMsg = (Message)IokeObject.data(message);
Message copyMsg = (Message)IokeObject.data(copy);

copyMsg.type = orgMsg.type;
copyMsg.isTerminator = orgMsg.isTerminator;
copyMsg.cached = orgMsg.cached;

List<Object> newArgs = new ArrayList<Object>();
Expand Down Expand Up @@ -138,12 +137,8 @@ public static Object getArg2(IokeObject message) {
return ((Message)IokeObject.data(message)).arguments.get(1);
}

public static Type type(IokeObject message) {
return ((Message)IokeObject.data(message)).type;
}

public static void setType(IokeObject message, Type type) {
((Message)IokeObject.data(message)).type = type;
public static void setIsTerminator(Object message, boolean isTerminator) {
((Message)IokeObject.data(message)).isTerminator = isTerminator;
}

public static String getStackTraceText(Object _message) throws ControlFlow {
Expand Down Expand Up @@ -926,7 +921,7 @@ public void setPosition(int pos) {
public IokeData cloneData(IokeObject obj, IokeObject message, IokeObject context) {
Message m = new Message(obj.runtime, name);
m.arguments = new ArrayList<Object>(((Message)IokeObject.data(obj)).arguments);
m.type = ((Message)IokeObject.data(obj)).type;
m.isTerminator = ((Message)IokeObject.data(obj)).isTerminator;
m.file = ((Message)IokeObject.data(obj)).file;
m.line = ((Message)IokeObject.data(obj)).line;
m.pos = ((Message)IokeObject.data(obj)).pos;
Expand All @@ -950,7 +945,7 @@ public static IokeObject newFromStream(Runtime runtime, Reader reader, IokeObjec
IokeObject m = parser.parseFully();

if(m == null) {
Message mx = new Message(runtime, ".", null, Type.TERMINATOR);
Message mx = new Message(runtime, ".", null, true);
mx.setLine(0);
mx.setPosition(0);
return runtime.createMessage(mx);
Expand Down Expand Up @@ -1222,7 +1217,7 @@ public String code() {
currentCode(base);

if(next != null) {
if(this.type != Type.TERMINATOR) {
if(!this.isTerminator) {
base.append(" ");
}

Expand All @@ -1238,7 +1233,7 @@ public String formattedCode(int indent, IokeObject ctx) throws ControlFlow {
currentFormattedCode(base, indent, ctx);

if(next != null) {
if(this.type != Type.TERMINATOR) {
if(!this.isTerminator) {
base.append(" ");
}

Expand Down Expand Up @@ -1298,7 +1293,7 @@ private void currentCode(StringBuilder base) {
base.append(this.arguments.get(0));
} else if(cached != null && this.name.equals("cachedResult")) {
base.append(cached);
} else if(this.type == Type.TERMINATOR) {
} else if(this.isTerminator) {
base.append(".\n");
} else {
base.append(this.name);
Expand Down Expand Up @@ -1347,7 +1342,7 @@ private void currentFormattedCode(StringBuilder base, int indent, IokeObject ctx
base.append(this.arguments.get(0));
base.append(" = ");
base.append(Message.formattedCode(IokeObject.as(this.arguments.get(1), ctx), indent+2, ctx));
} else if(this.type == Type.TERMINATOR) {
} else if(this.isTerminator) {
base.append("\n");
for(int i=0;i<indent;i++) {
base.append(" ");
Expand Down
2 changes: 1 addition & 1 deletion src/ikj/main/ioke/lang/parser/IokeParser.java
Expand Up @@ -514,7 +514,7 @@ private IokeObject parseTerminator(int indicator) throws IOException {
}
}

Message m = new Message(runtime, ".", null, Message.Type.TERMINATOR);
Message m = new Message(runtime, ".", null, true);
m.setLine(l);
m.setPosition(cc);
//System.err.println("-parseTerminator()");
Expand Down
34 changes: 3 additions & 31 deletions src/ikj/main/ioke/lang/parser/Levels.java
Expand Up @@ -397,17 +397,6 @@ public void attachToTopAndPush(IokeObject msg, int precedence) throws ControlFlo
stack.add(0, level);
}

private void detach(IokeObject msg) throws ControlFlow {
IokeObject brackets = runtime.newMessage("");
Message.copySourceLocation(msg, brackets);
brackets.getArguments().addAll(msg.getArguments());
msg.getArguments().clear();

// Insert the brackets message between msg and its next message
Message.setNext(brackets, Message.next(msg));
Message.setNext(msg, brackets);
}

public void attach(IokeObject msg, List<IokeObject> expressions) throws ControlFlow {
// TODO: fix all places with setNext to do setPrev too!!!

Expand Down Expand Up @@ -435,12 +424,7 @@ public void attach(IokeObject msg, List<IokeObject> expressions) throws ControlF
}


if(inverted && (msgArgCount == 0 || Message.type(msg) == Message.Type.DETACH)) {
if(Message.type(msg) == Message.Type.DETACH) {
detach(msg);
msgArgCount = 0;
}

if(inverted && msgArgCount == 0) {
IokeObject head = msg;
while(Message.prev(head) != null && !Message.isTerminator(Message.prev(head))) {
head = Message.prev(head);
Expand Down Expand Up @@ -483,14 +467,8 @@ public void attach(IokeObject msg, List<IokeObject> expressions) throws ControlF
// b c Message.next(msg)
*/
if(argCountForOp != -1 &&
(msgArgCount == 0 || Message.type(msg) == Message.Type.DETACH) &&
(msgArgCount == 0) &&
!((Message.next(msg) != null) && Message.name(Message.next(msg)).equals("="))) {

if(msgArgCount != 0 && Message.type(msg) == Message.Type.DETACH) {
detach(msg);
msgArgCount = 0;
}

Level currentLevel = currentLevel();
IokeObject attaching = currentLevel.message;
String setCellName;
Expand Down Expand Up @@ -567,13 +545,7 @@ public void attach(IokeObject msg, List<IokeObject> expressions) throws ControlF
popDownTo(precedence, expressions);
attachToTopAndPush(msg, precedence);
} else {
if(Message.type(msg) == Message.Type.DETACH) {
detach(msg);
popDownTo(precedence, expressions);
attachToTopAndPush(msg, precedence);
} else {
attachAndReplace(currentLevel(), msg);
}
attachAndReplace(currentLevel(), msg);
}
} else {
attachAndReplace(currentLevel(), msg);
Expand Down
5 changes: 5 additions & 0 deletions test/assignment_spec.ik
Expand Up @@ -74,6 +74,11 @@ describe("assignment",
m should == "Ground =(.., method)"
)
it("should not undetach things with spaces inbetween",
m = parse("foo (1) = 42")
m should == "foo =((1), 42)"
)
describe("with destructuring",
it("should assign all the values in tuple to all the names on the left hand side", {pending: true},
(val1, val2) = (42, 25)
Expand Down

0 comments on commit 0db5b23

Please sign in to comment.