Browse Source

Misc pre-processor fixes

Bepsi 6 years ago
parent
commit
80f751a5bc

+ 1 - 0
NTERA.Compiler/Compiler.cs

@@ -216,6 +216,7 @@ namespace NTERA.Compiler
 				new Keyword("PRINTFORM", true, true),
 				new Keyword("PRINTPLAINFORM", true, true),
 				new Keyword("DEBUGPRINTFORML", true, true),
+				new Keyword("THROW", true, true),
 
 				new Keyword("PRINT", true),
 				new Keyword("PRINTW", true),

+ 63 - 9
NTERA.Interpreter/Compiler/Lexer.cs

@@ -41,6 +41,7 @@ namespace NTERA.Interpreter.Compiler
 		}
 
 		public bool IsPeeking { get; protected set; }
+		public bool SingleLineMode { get; protected set; }
 
 		public char GetNextChar(bool peek = false)
 		{
@@ -114,9 +115,9 @@ namespace NTERA.Interpreter.Compiler
 
 		private static Regex PowRegex = new Regex(@"(\d+)p(\d+)");
 
-		private static bool IsWhitespace(char c)
+		private static bool IsWhitespace(char c, bool singleLineMode)
 		{
-			return char.IsWhiteSpace(c) && c != '\n';
+			return char.IsWhiteSpace(c) && (c != '\n' || singleLineMode);
 		}
 
 		private static bool IsEndOfLine(char c)
@@ -171,6 +172,48 @@ namespace NTERA.Interpreter.Compiler
 
 					return Token.EOF;
 
+				case '{':
+					if (sourceMarker.Pointer == 0 || source[sourceMarker.Pointer - 1] == '\n')
+					{
+						SingleLineMode = true;
+
+						if (IsPeeking)
+							GetNextChar();
+
+						while (CurrentChar != '\n')
+						{
+							if (CurrentChar == '\0')
+								return Token.EOF;
+
+							GetNextChar();
+						}
+
+						return Token.NewLine;
+					}
+
+					return Token.OpenBracket;
+
+				case '}':
+					if (sourceMarker.Pointer == 0 || source[sourceMarker.Pointer - 1] == '\n')
+					{
+						SingleLineMode = false;
+
+						if (IsPeeking)
+							GetNextChar();
+
+						while (CurrentChar != '\n')
+						{
+							if (CurrentChar == '\0')
+								return Token.EOF;
+
+							GetNextChar();
+						}
+
+						return Token.NewLine;
+					}
+
+					return Token.CloseBracket;
+
 				case '<':
 					if (GetNextChar(true) == '>')
 					{
@@ -219,10 +262,11 @@ namespace NTERA.Interpreter.Compiler
 						return Token.Minus;
 
 				case '=':
-					if (peek)
-						GetNextChar();
+					char adv = !peek && !IsPeeking
+						? GetNextChar(true)
+						: source[sourceMarker.Pointer + 2];
 
-					if (GetNextChar(true) == '=')
+					if (adv == '=')
 						GetNextChar();
 
 					return Token.Equal;
@@ -270,7 +314,7 @@ namespace NTERA.Interpreter.Compiler
 
 			while (true)
 			{
-				while (IsWhitespace(GetNextChar()))
+				while (IsWhitespace(GetNextChar(), SingleLineMode))
 				{
 				}
 
@@ -293,7 +337,7 @@ namespace NTERA.Interpreter.Compiler
 				StringBuilder bodyBuilder = new StringBuilder(CurrentChar.ToString());
 
 				while (DetermineToken(true, false) == Token.Unknown
-					   && !IsWhitespace(GetNextChar(true)))
+					   && !IsWhitespace(GetNextChar(true), SingleLineMode))
 				{
 					bodyBuilder.Append(GetNextChar());
 				}
@@ -368,7 +412,7 @@ namespace NTERA.Interpreter.Compiler
 			{ Token.Caret, 4 }
 		};
 
-		public Value Expression()
+		public Value ConstantExpression()
 		{
 			Stack<Value> stack = new Stack<Value>();
 			Stack<Token> operators = new Stack<Token>();
@@ -388,6 +432,16 @@ namespace NTERA.Interpreter.Compiler
 				{
 					stack.Push(Value);
 				}
+				else if (currentEnumerator.Current == Token.QuotationMark)
+				{
+					StringBuilder builder = new StringBuilder();
+					char stringChar;
+
+					while ((stringChar = GetNextChar()) != '"')
+						builder.Append(stringChar);
+
+					stack.Push(builder.ToString());
+				}
 				else if (currentEnumerator.Current == Token.Identifer)
 				{
 					throw new ParserException("Undeclared variable " + Identifier, TokenMarker);
@@ -395,7 +449,7 @@ namespace NTERA.Interpreter.Compiler
 				else if (currentEnumerator.Current == Token.LParen)
 				{
 					currentEnumerator.MoveNext();
-					stack.Push(Expression());
+					stack.Push(ConstantExpression());
 
 					if (currentEnumerator.Current != Token.RParen)
 						throw new ParserException($"Was expecting [LParen] got [{currentEnumerator.Current}]", TokenMarker);

+ 14 - 14
NTERA.Interpreter/Compiler/Parser.cs

@@ -145,11 +145,11 @@ namespace NTERA.Interpreter.Compiler
 
 						if (Enumerator.Current == Token.Increment)
 						{
-							value = OperateNodes(variable, CreateConstant(1), Token.Plus);
+							value = OperateNodes(variable, CreateConstant(1, CurrentPosition), Token.Plus);
 						}
 						else if (Enumerator.Current == Token.Decrement)
 						{
-							value = OperateNodes(variable, CreateConstant(1), Token.Minus);
+							value = OperateNodes(variable, CreateConstant(1, CurrentPosition), Token.Minus);
 						}
 						else if (Enumerator.Current != Token.Equal)
 						{
@@ -328,7 +328,7 @@ namespace NTERA.Interpreter.Compiler
 
 							if (Enumerator.Current == Token.Identifer)
 							{
-								newValue = CreateConstant(Lexer.Identifier);
+								newValue = CreateConstant(Lexer.Identifier, CurrentPosition);
 							}
 							else if (Enumerator.Current == Token.OpenBracket)
 							{
@@ -413,7 +413,7 @@ namespace NTERA.Interpreter.Compiler
 							return null;
 						}
 
-						node.SubNodes = new[] { CreateConstant(Lexer.Identifier) };
+						node.SubNodes = new[] { CreateConstant(Lexer.Identifier, CurrentPosition) };
 
 						return node;
 					}
@@ -543,14 +543,14 @@ namespace NTERA.Interpreter.Compiler
 				}
 				else if (token == Token.Value)
 				{
-					indices.Add(CreateConstant(Lexer.Value));
+					indices.Add(CreateConstant(Lexer.Value, CurrentPosition));
 				}
 				else if (token == Token.Identifer)
 				{
 					if (CsvDefinition.VariableIndexDictionary.TryGetValue(variableName, out var varTable)
 						&& varTable.TryGetValue(Lexer.Identifier, out int index))
 					{
-						indices.Add(CreateConstant(index));
+						indices.Add(CreateConstant(index, CurrentPosition));
 						continue;
 					}
 
@@ -760,7 +760,7 @@ namespace NTERA.Interpreter.Compiler
 			{
 				if (token == Token.Value)
 				{
-					operands.Push(CreateConstant(Lexer.Value));
+					operands.Push(CreateConstant(Lexer.Value, CurrentPosition));
 
 					AttemptUnaryConversion(out error);
 					if (error != null)
@@ -868,7 +868,7 @@ namespace NTERA.Interpreter.Compiler
 			if (error != null)
 				return null;
 
-			return CallMethod("__IMPLICITIF", CurrentPosition, result, resultTrue, resultFalse);
+			return CallMethod("__INLINEIF", CurrentPosition, result, resultTrue, resultFalse);
 		}
 
 		protected ExecutionNode ParseString(out ParserError error, bool implicitString, bool canFormat = false, bool nestedTernary = false)
@@ -974,7 +974,7 @@ namespace NTERA.Interpreter.Compiler
 				return null;
 			}
 
-			ExecutionNode appendedValue = CreateConstant(currentBlock.ToString());
+			ExecutionNode appendedValue = CreateConstant(currentBlock.ToString(), CurrentPosition);
 
 			value = value == null
 				? appendedValue
@@ -991,14 +991,14 @@ namespace NTERA.Interpreter.Compiler
 			[Token.Slash] = "divide",
 		};
 
-		private static string GetOperationName(Token token)
+		public static string GetOperationName(Token token)
 		{
 			return OperationNames.TryGetValue(token, out string result)
 				? result
 				: token.ToString();
 		}
 
-		private ExecutionNode CreateConstant(Value value)
+		public static ExecutionNode CreateConstant(Value value, Marker symbolMarker)
 		{
 			return new ExecutionNode
 			{
@@ -1008,11 +1008,11 @@ namespace NTERA.Interpreter.Compiler
 					["type"] = value.Type.ToString(),
 					["value"] = value.ToString()
 				},
-				Symbol = CurrentPosition
+				Symbol = symbolMarker
 			};
 		}
 
-		private static ExecutionNode OperateNodes(ExecutionNode left, ExecutionNode right, Token token)
+		public static ExecutionNode OperateNodes(ExecutionNode left, ExecutionNode right, Token token)
 		{
 			return new ExecutionNode
 			{
@@ -1029,7 +1029,7 @@ namespace NTERA.Interpreter.Compiler
 			};
 		}
 
-		private static ExecutionNode CallMethod(string methodName, Marker symbolMarker, params ExecutionNode[] parameters)
+		public static ExecutionNode CallMethod(string methodName, Marker symbolMarker, params ExecutionNode[] parameters)
 		{
 			return new ExecutionNode
 			{

+ 7 - 31
NTERA.Interpreter/Compiler/Preprocessor.cs

@@ -103,34 +103,9 @@ namespace NTERA.Interpreter.Compiler
 							{
 								enumerator.MoveNext();
 
-								bool hasUnaryMinus = false;
+								defaultValue = lexer.ConstantExpression();
 
-								if (enumerator.Current == Token.Minus)
-								{
-									hasUnaryMinus = true;
-									enumerator.MoveNext();
-								}
-
-								if (enumerator.Current == Token.Identifer)
-								{
-									defaultValue = lexer.Identifier;
-								}
-								else if (enumerator.Current == Token.Value)
-								{
-									defaultValue = lexer.Value;
-
-									if (hasUnaryMinus)
-									{
-										if (defaultValue.Value.Type == ValueType.Real)
-											defaultValue = defaultValue * -1;
-										else
-											defaultValue = "-" + defaultValue;
-									}
-								}
-								else
-									throw new ParserException("Invalid function declaration", lexer.TokenMarker);
-
-								enumerator.MoveNext();
+								//enumerator.MoveNext();
 							}
 
 							if (enumerator.Current == Token.Comma
@@ -192,16 +167,17 @@ namespace NTERA.Interpreter.Compiler
 										   && enumerator.Current != Token.NewLine
 										   && enumerator.Current != Token.EOF)
 									{
-									}
+										//arraySize = (int)lexer.Expression().Real;
 
-									//arraySize = (int)lexer.Expression().Real;
-								}
+										//the array size goes here, but we ignore it since it's useless to us
+										}
+									}
 
 								if (enumerator.Current == Token.Equal)
 								{
 									enumerator.MoveNext();
 
-									defaultValue = lexer.Expression();
+									defaultValue = lexer.ConstantExpression();
 								}
 								else if (enumerator.Current != Token.NewLine
 										 && enumerator.Current != Token.EOF)

+ 2 - 2
NTERA.Interpreter/Compiler/Token.cs

@@ -47,10 +47,10 @@
 		[LexerCharacter(',')]
 		Comma,
 
-		[LexerCharacter('{')]
+		//[LexerCharacter('{')]
 		OpenBracket,
 
-		[LexerCharacter('}')]
+		//[LexerCharacter('}')]
 		CloseBracket,
 
 		[LexerCharacter('%')]