/*
* #%~
* The VDM parser
* %%
* Copyright (C) 2008 - 2014 Overture
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #~%
*/
package org.overture.parser.util;
import java.io.File;
import java.util.List;
import org.overture.ast.definitions.SClassDefinition;
import org.overture.ast.expressions.PExp;
import org.overture.ast.lex.Dialect;
import org.overture.ast.modules.AModuleModules;
import org.overture.config.Settings;
import org.overture.parser.lex.LexException;
import org.overture.parser.lex.LexTokenReader;
import org.overture.parser.messages.VDMError;
import org.overture.parser.messages.VDMWarning;
import org.overture.parser.syntax.ClassReader;
import org.overture.parser.syntax.ExpressionReader;
import org.overture.parser.syntax.ModuleReader;
import org.overture.parser.syntax.ParserException;
public class ParserUtil
{
public static class ParserResult<T>
{
public static interface IResultCombiner<T>
{
public void combine(T source, T other);
}
public final T result;
public final List<VDMWarning> warnings;
public final List<VDMError> errors;
public ParserResult(T result, List<VDMWarning> warnings,
List<VDMError> errors)
{
this.result = result;
this.warnings = warnings;
this.errors = errors;
}
public void combine(ParserResult<T> other, IResultCombiner<T> combiner)
{
this.errors.addAll(other.errors);
this.warnings.addAll(other.warnings);
combiner.combine(this.result, other.result);
}
public String getErrorString()
{
StringBuilder sb = new StringBuilder();
sb.append("\tErrors:");
for (VDMError err : errors)
{
sb.append("\n\t" + err);
}
return sb.toString();
}
public String getWarningString()
{
StringBuilder sb = new StringBuilder();
sb.append("\tWarnings:");
for (VDMWarning err : warnings)
{
sb.append("\n\t" + err);
}
return sb.toString();
}
}
public static ParserResult<List<SClassDefinition>> parseOo(List<File> files)
{
return parseOo(files, null);
}
public static ParserResult<List<SClassDefinition>> parseOo(
List<File> files, String charset)
{
ParserResult<List<SClassDefinition>> res = null;
for (File file : files)
{
if (res == null)
{
res = parseOo(file, charset);
} else
{
res.combine(parseOo(file, charset), new ParserResult.IResultCombiner<List<SClassDefinition>>()
{
@Override
public void combine(List<SClassDefinition> source,
List<SClassDefinition> other)
{
source.addAll(other);
}
});
}
}
return res;
}
public static ParserResult<List<SClassDefinition>> parseOo(File file)
{
return parseOo(file, null);
}
public static ParserResult<List<SClassDefinition>> parseOo(File file,
String charset)
{
LexTokenReader ltr = getReader(file, Settings.dialect, charset);
ClassReader reader = null;
List<SClassDefinition> result = null;
reader = new ClassReader(ltr);
result = reader.readClasses();
return new ParserResult<List<SClassDefinition>>(result, reader.getWarnings(), reader.getErrors());
}
private static LexTokenReader getReader(File file, Dialect dialect,
String charset)
{
if (charset == null)
return new LexTokenReader(file, Settings.dialect);
else
return new LexTokenReader(file, Settings.dialect, charset);
}
private static LexTokenReader getReader(String content, Dialect dialect,
String charset)
{
if (charset == null)
return new LexTokenReader(content, Settings.dialect);
else
return new LexTokenReader(content, Settings.dialect, charset);
}
public static ParserResult<List<SClassDefinition>> parseOo(String content)
{
return parseOo(content, null);
}
public static ParserResult<List<SClassDefinition>> parseOo(String content,
String charset)
{
LexTokenReader ltr = getReader(content, Settings.dialect, charset);
ClassReader reader = null;
List<SClassDefinition> result = null;
reader = new ClassReader(ltr);
result = reader.readClasses();
return new ParserResult<List<SClassDefinition>>(result, reader.getWarnings(), reader.getErrors());
}
public static ParserResult<List<AModuleModules>> parseSl(List<File> files)
{
return parseSl(files, null);
}
public static ParserResult<List<AModuleModules>> parseSl(List<File> files,
String charset)
{
ParserResult<List<AModuleModules>> res = null;
for (File file : files)
{
if (res == null)
{
res = parseSl(file);
} else
{
res.combine(parseSl(file, charset), new ParserResult.IResultCombiner<List<AModuleModules>>()
{
@Override
public void combine(List<AModuleModules> source,
List<AModuleModules> other)
{
source.addAll(other);
}
});
}
}
return res;
}
public static ParserResult<List<AModuleModules>> parseSl(File file)
{
return parseSl(file, null);
}
public static ParserResult<List<AModuleModules>> parseSl(File file,
String charset)
{
LexTokenReader ltr = getReader(file, Settings.dialect, charset);
ModuleReader reader = null;
List<AModuleModules> result = null;
reader = new ModuleReader(ltr);
result = reader.readModules();
return new ParserResult<List<AModuleModules>>(result, reader.getWarnings(), reader.getErrors());
}
public static ParserResult<List<AModuleModules>> parseSl(String content)
{
return parseSl(content, null);
}
public static ParserResult<List<AModuleModules>> parseSl(String content,
String charset)
{
LexTokenReader ltr = getReader(content, Settings.dialect, charset);
ModuleReader reader = null;
List<AModuleModules> result = null;
reader = new ModuleReader(ltr);
result = reader.readModules();
return new ParserResult<List<AModuleModules>>(result, reader.getWarnings(), reader.getErrors());
}
public static ParserResult<PExp> parseExpression(String content)
throws ParserException, LexException
{
LexTokenReader ltr = new LexTokenReader(content, Settings.dialect);
PExp result = null;
ExpressionReader reader = new ExpressionReader(ltr);
// reader.setCurrentModule(getDefaultName());
result = reader.readExpression();
return new ParserResult<PExp>(result, reader.getWarnings(), reader.getErrors());
}
}