﻿/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 * ******************************************************************************
 * Mats Alm   		                Added       		        2013-03-01 (Prior file history on https://github.com/swmal/ExcelFormulaParser)
 *******************************************************************************/

using System;
using System.Collections.Generic;

namespace EpplusFormulaParser;

internal static class SyntacticAnalyzer {
  private ref struct AnalyzingContext {
    public int NumberOfOpenedParentheses { get; set; }

    public int NumberOfClosedParentheses { get; set; }

    public int OpenedStrings { get; set; }

    public int ClosedStrings { get; set; }

    public bool IsInString { get; set; }
  }

  public static void Analyze(IEnumerable<Token> tokens) {
    var context = new AnalyzingContext();
    foreach (var token in tokens) {
      if (token.TokenType == TokenType.Unrecognized) {
        throw new UnrecognizedTokenException(token);
      }
      EnsureParenthesesAreWellFormed(token, ref context);
      EnsureStringsAreWellFormed(token, ref context);
    }
    Validate(ref context);
  }

  private static void Validate(ref AnalyzingContext context) {
    if (context.NumberOfOpenedParentheses != context.NumberOfClosedParentheses) {
      throw new FormatException("Number of opened and closed parentheses does not match");
    }
    if (context.OpenedStrings != context.ClosedStrings) {
      throw new FormatException("Unterminated string");
    }
  }

  private static void EnsureParenthesesAreWellFormed(Token token, ref AnalyzingContext context) {
    if (token.TokenType == TokenType.OpeningParenthesis) {
      context.NumberOfOpenedParentheses++;
    } else if (token.TokenType == TokenType.ClosingParenthesis) {
      context.NumberOfClosedParentheses++;
    }
  }

  private static void EnsureStringsAreWellFormed(Token token, ref AnalyzingContext context) {
    if (!context.IsInString && token.TokenType == TokenType.String) {
      context.IsInString = true;
      context.OpenedStrings++;
    } else if (context.IsInString && token.TokenType == TokenType.String) {
      context.IsInString = false;
      context.ClosedStrings++;
    }
  }
}
