diff --git a/SMILEBASIC/node.d b/SMILEBASIC/node.d index 84f628c..54ab14d 100644 --- a/SMILEBASIC/node.d +++ b/SMILEBASIC/node.d @@ -46,6 +46,8 @@ enum NodeType Swap, AssignRef, VarRef, + XOn, + XOff, } abstract class Node { @@ -631,3 +633,24 @@ class VarRef : Expression this.expression = expr; } } +class XOn : Statement +{ + wstring func; + this(wstring func, SourceLocation loc) + { + super.location = loc; + this.type = NodeType.XOn; + this.func = func; + } +} +class XOff : Statement +{ + wstring func; + this(wstring func, SourceLocation loc) + { + super.location = loc; + this.type = NodeType.XOff; + this.func = func; + } +} + diff --git a/SMILEBASIC/parser.d b/SMILEBASIC/parser.d index 4d56aca..3e1eb35 100644 --- a/SMILEBASIC/parser.d +++ b/SMILEBASIC/parser.d @@ -864,8 +864,11 @@ class Parser case TokenType.Iden: { wstring name = token.value.stringValue; - if (name == "OPTION") + auto uname = std.uni.toUpper(name); + if (uname == "OPTION") { + lex.popFront; + token = lex.front; if (token.type != TokenType.Iden) { syntaxError(); @@ -880,6 +883,24 @@ class Parser lex.popFront(); return new Option(arg, lex.location); } + if (uname == "XON" || uname == "XOFF") + { + lex.popFront; + token = lex.front; + if (token.type != TokenType.Iden) + { + syntaxError(); + return null; + } + auto arg = std.uni.toUpper(token.value.stringValue); + if (arg != "MOTION" && arg != "EXPAD" && arg != "MIC" && arg != "WIIU") + { + syntaxError(); + return null; + } + lex.popFront(); + return uname == "XON" ? new XOn(arg, lex.location) : new XOff(arg, lex.location); + } if (token.type != TokenType.Call) { auto old = lex.save;