private void ScanNumber() { string scannedSymbol = ""; bool hasDecimalSeparator = false; char prevCh = currentCharacter.Value; while (LexicalUtils.IsDigit(currentCharacter.Value) || LexicalUtils.IsDecimalSeparator(currentCharacter.Value)) { if (LexicalUtils.IsDecimalSeparator(currentCharacter.Value)) { if (hasDecimalSeparator) { if (LexicalUtils.IsDecimalSeparator(prevCh)) { CurrentSymbol = SymbolEnum.IntConstant; IntConstant = int.Parse(scannedSymbol.Substring(0, scannedSymbol.Length - 1)); symbolQueue.Enqueue(SymbolEnum.TwoDots); currentCharacter = ioModule.NextCh(); return; } else { break; } } hasDecimalSeparator = true; } scannedSymbol += currentCharacter.Value.ToString(); prevCh = currentCharacter.Value; currentCharacter = ioModule.NextCh(); } if (hasDecimalSeparator) { double result; if (double.TryParse(scannedSymbol, NumberStyles.Any, CultureInfo.InvariantCulture, out result) && result < MAX_FLOAT_CONSTANT) { CurrentSymbol = SymbolEnum.RealConstant; FloatConstant = result; } else { Error = ioModule.AddError(207, CurrentLineNumber, CurrentPositionInLine); } } else { int result; if (int.TryParse(scannedSymbol, out result) && result < MAX_INT_CONSTANT) { CurrentSymbol = SymbolEnum.IntConstant; IntConstant = result; } else { Error = ioModule.AddError(203, CurrentLineNumber, CurrentPositionInLine); } } }
private void ScanIdentifier() { string scannedSymbol = ""; while (LexicalUtils.IsIdentifierChar(currentCharacter.Value)) { scannedSymbol += currentCharacter.Value.ToString(); currentCharacter = ioModule.NextCh(); } SymbolEnum keyword; if (Symbol.keywordMapping.TryGetValue(scannedSymbol, out keyword)) { CurrentSymbol = keyword; } else { CurrentSymbol = SymbolEnum.Identifier; NameTable.Add(scannedSymbol); IdentifierName = scannedSymbol; } }
private void ScanSymbol() { if (LexicalUtils.IsDigit(currentCharacter.Value)) { ScanNumber(); } else if (LexicalUtils.IsStringConstantStart(currentCharacter.Value)) { ScanString(); } else if (LexicalUtils.IsIdentifierStart(currentCharacter.Value)) { ScanIdentifier(); } else { switch (currentCharacter.Value) { case '<': currentCharacter = ioModule.NextCh(); if (currentCharacter.Value == '=') { CurrentSymbol = SymbolEnum.LessEquals; currentCharacter = ioModule.NextCh(); } else { if (currentCharacter.Value == '>') { CurrentSymbol = SymbolEnum.NotEquals; currentCharacter = ioModule.NextCh(); } else { CurrentSymbol = SymbolEnum.Less; } } break; case '>': currentCharacter = ioModule.NextCh(); if (currentCharacter.Value == '=') { CurrentSymbol = SymbolEnum.GreaterEquals; currentCharacter = ioModule.NextCh(); } else { CurrentSymbol = SymbolEnum.Less; } break; case ':': currentCharacter = ioModule.NextCh(); if (currentCharacter.Value == '=') { CurrentSymbol = SymbolEnum.Assign; currentCharacter = ioModule.NextCh(); } else { CurrentSymbol = SymbolEnum.Colon; } break; case '+': CurrentSymbol = SymbolEnum.Plus; currentCharacter = ioModule.NextCh(); break; case '-': CurrentSymbol = SymbolEnum.Minus; currentCharacter = ioModule.NextCh(); break; case '*': CurrentSymbol = SymbolEnum.Star; currentCharacter = ioModule.NextCh(); break; case '/': CurrentSymbol = SymbolEnum.Slash; currentCharacter = ioModule.NextCh(); break; case '=': CurrentSymbol = SymbolEnum.Equals; currentCharacter = ioModule.NextCh(); break; case '(': currentCharacter = ioModule.NextCh(); if (currentCharacter.Value == '*') { ScanMultilineComment(); } else { CurrentSymbol = SymbolEnum.LeftRoundBracket; } break; case ')': CurrentSymbol = SymbolEnum.RightRoundBracket; currentCharacter = ioModule.NextCh(); break; case '[': CurrentSymbol = SymbolEnum.LeftSquareBracket; currentCharacter = ioModule.NextCh(); break; case ']': CurrentSymbol = SymbolEnum.RightSquareBracket; currentCharacter = ioModule.NextCh(); break; case '{': CurrentSymbol = SymbolEnum.LeftCurlyBracket; currentCharacter = ioModule.NextCh(); break; case '}': CurrentSymbol = SymbolEnum.RightCurlyBracket; currentCharacter = ioModule.NextCh(); break; case '.': currentCharacter = ioModule.NextCh(); if (currentCharacter.Value == '.') { CurrentSymbol = SymbolEnum.TwoDots; currentCharacter = ioModule.NextCh(); } else { CurrentSymbol = SymbolEnum.Dot; } break; case ',': CurrentSymbol = SymbolEnum.Comma; currentCharacter = ioModule.NextCh(); break; case '^': CurrentSymbol = SymbolEnum.Arrow; currentCharacter = ioModule.NextCh(); break; case ';': CurrentSymbol = SymbolEnum.Semicolon; currentCharacter = ioModule.NextCh(); break; default: Error = ioModule.AddError(6, CurrentLineNumber, CurrentPositionInLine); break; } } }