Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- namespace CodeDojo.Linjeteller
- {
- internal class Program
- {
- private static void Main(string[] args)
- {
- var startTime = DateTime.Now;
- var startState = ConstructParser();
- var initTime = DateTime.Now;
- foreach (var s in args)
- {
- var runTime = DateTime.Now;
- var linesOfCode = GetLinesOfCode(s, startState);
- var stepTime = DateTime.Now;
- Console.WriteLine("Antall linjer: {0}", linesOfCode);
- Console.WriteLine("Run: {0}", (stepTime - runTime).Milliseconds);
- Console.WriteLine("------------------------");
- }
- var stopTime = DateTime.Now;
- Console.WriteLine("InitTime: {0}", (stopTime - startTime).Milliseconds);
- Console.Read();
- }
- private static State ConstructParser()
- {
- var startState = new State();
- var firstSlashState = new State();
- var secondSlashState = new State();
- var firstSlashTextState = new State();
- var secondTextSlashState = new State();
- var firstAsteriskState = new State();
- var secondAsteriskState = new State();
- var firstTextAsteriskState = new State();
- var secondTextAsteriskState = new State();
- var textState = new State() { IsCode = true };
- var quoteState = new State();
- #region startstate
- startState.DefaultState = textState;
- startState.ValidStates.Add('/', firstSlashState);
- startState.ValidStates.Add('\t', startState);
- startState.ValidStates.Add('\n', startState);
- startState.ValidStates.Add(' ', startState);
- #endregion
- #region quoteState
- quoteState.DefaultState = quoteState;
- quoteState.ValidStates.Add('\n', startState);
- quoteState.ValidStates.Add('"', textState);
- #endregion
- #region textState
- textState.DefaultState = textState;
- textState.ValidStates.Add('/', firstSlashTextState);
- textState.ValidStates.Add('"', quoteState);
- textState.ValidStates.Add('\n', startState);
- #endregion
- #region firstSlashTextState
- firstSlashTextState.DefaultState = textState;
- firstSlashTextState.ValidStates.Add('/', secondTextSlashState);
- firstSlashTextState.ValidStates.Add('*', firstTextAsteriskState);
- #endregion
- #region secondSlashState
- secondTextSlashState.DefaultState = secondTextSlashState;
- secondTextSlashState.ValidStates.Add('\n', startState);
- #endregion
- #region firstSlashState
- firstSlashState.ValidStates.Add('/', secondSlashState);
- firstSlashState.ValidStates.Add('*', firstAsteriskState);
- firstSlashState.DefaultState = textState;
- #endregion
- #region secondSlashState
- secondSlashState.DefaultState = secondSlashState;
- secondSlashState.ValidStates.Add('\n', startState);
- #endregion
- #region firstTextAsteriskState
- firstTextAsteriskState.DefaultState = firstTextAsteriskState;
- firstTextAsteriskState.ValidStates.Add('*', secondTextAsteriskState);
- #endregion
- #region secondTextAsteriskState
- secondTextAsteriskState.DefaultState = firstTextAsteriskState;
- secondTextAsteriskState.ValidStates.Add('/', startState);
- #endregion
- #region firstAsteriskState
- firstAsteriskState.ValidStates.Add('*', secondAsteriskState);
- firstAsteriskState.DefaultState = firstAsteriskState;
- #endregion
- #region secondAsteriskState
- secondAsteriskState.DefaultState = firstAsteriskState;
- secondAsteriskState.ValidStates.Add('/', startState);
- #endregion
- return startState;
- }
- public static int GetLinesOfCode(string pathToFile, State currentState)
- {
- if (string.IsNullOrEmpty(pathToFile))
- throw new ArgumentException();
- var file = System.IO.File.ReadAllLines(pathToFile);
- var counter = 0;
- foreach (var line in file)
- {
- var lineHasBeenIncremented = false;
- foreach (var c in line.ToCharArray())
- {
- currentState = NewState(currentState, c);
- if (currentState.IsCode && !lineHasBeenIncremented)
- {
- lineHasBeenIncremented = true;
- counter++;
- }
- }
- currentState = NewState(currentState, '\n');
- }
- return counter;
- }
- private static State NewState(State currentState, char c)
- {
- if (currentState.ValidStates.ContainsKey(c))
- {
- currentState = currentState.ValidStates[c];
- }
- else if (currentState.DefaultState != null)
- {
- currentState = currentState.DefaultState;
- }
- return currentState;
- }
- }
- public class State
- {
- public Dictionary<char, State> ValidStates { get; set; }
- public State DefaultState = null;
- public bool IsCode = false;
- public State()
- {
- ValidStates = new Dictionary<char, State>();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement