Storm 1.14.0.1
A Modern Probabilistic Model Checker
Loading...
Searching...
No Matches
JaniParser.h
Go to the documentation of this file.
1#pragma once
5#include "storm/logic/Bound.h"
13
14namespace storm {
15namespace jani {
16class Model;
17class Automaton;
18class Variable;
19class Composition;
20class Property;
21struct PropertyInterval;
22} // namespace jani
23
24namespace logic {
25enum class FormulaContext;
26}
27
28namespace parser {
29/*
30 * The JANI format parser.
31 * Parses Models and Properties
32 */
33template<typename ValueType>
35 public:
36 typedef std::vector<storm::jani::Property> PropertyVector;
37 typedef std::unordered_map<std::string, storm::jani::Variable const*> VariablesMap;
38 typedef std::unordered_map<std::string, storm::jani::Constant const*> ConstantsMap;
39 typedef std::unordered_map<std::string, storm::jani::FunctionDefinition const*> FunctionsMap;
41
42 JaniParser() : expressionManager(new storm::expressions::ExpressionManager()) {}
43 JaniParser(std::string const& jsonstring);
44 static std::pair<storm::jani::Model, std::vector<storm::jani::Property>> parse(std::string const& path, bool parseProperties = true);
45 static std::pair<storm::jani::Model, std::vector<storm::jani::Property>> parseFromString(std::string const& jsonstring, bool parseProperties = true);
46
47 protected:
48 void readFile(std::string const& path);
49
50 struct Scope {
59
60 Scope(Scope const& other) = default;
61 std::string description;
67 Scope refine(std::string const& prependedDescription = "") const {
68 Scope res(*this);
69 if (prependedDescription != "") {
70 res.description = "'" + prependedDescription + "' at " + res.description;
71 }
72 return res;
73 }
74
76 this->globalVars = nullptr;
77 this->localVars = nullptr;
78 return *this;
79 }
80 };
81
82 std::pair<storm::jani::Model, std::vector<storm::jani::Property>> parseModel(bool parseProperties = true);
83 storm::jani::Property parseProperty(storm::jani::Model& model, storm::json<ValueType> const& propertyStructure, Scope const& scope);
84 storm::jani::Automaton parseAutomaton(storm::json<ValueType> const& automatonStructure, storm::jani::Model const& parentModel, Scope const& scope);
85 std::pair<std::unique_ptr<storm::jani::JaniType>, storm::expressions::Type> parseType(storm::json<ValueType> const& typeStructure, std::string variableName,
86 Scope const& scope);
87 storm::jani::LValue parseLValue(storm::json<ValueType> const& lValueStructure, Scope const& scope);
88 std::shared_ptr<storm::jani::Variable> parseVariable(storm::json<ValueType> const& variableStructure, Scope const& scope,
89 std::string const& namePrefix = "");
90 storm::expressions::Expression parseExpression(storm::json<ValueType> const& expressionStructure, Scope const& scope,
91 bool returnNoneOnUnknownOpString = false,
92 std::unordered_map<std::string, storm::expressions::Variable> const& auxiliaryVariables = {});
93
94 private:
95 std::shared_ptr<storm::jani::Constant> parseConstant(storm::json<ValueType> const& constantStructure, Scope const& scope);
96 storm::jani::FunctionDefinition parseFunctionDefinition(storm::json<ValueType> const& functionDefinitionStructure, Scope const& scope, bool firstPass,
97 std::string const& parameterNamePrefix = "");
98
102 void parseActions(storm::json<ValueType> const& actionStructure, storm::jani::Model& parentModel);
103 std::shared_ptr<storm::logic::Formula const> parseFormula(storm::jani::Model& model, storm::json<ValueType> const& propertyStructure,
104 storm::logic::FormulaContext formulaContext, Scope const& scope,
105 boost::optional<storm::logic::Bound> bound = boost::none);
106 std::vector<storm::expressions::Expression> parseUnaryExpressionArguments(
107 storm::json<ValueType> const& expressionStructure, std::string const& opstring, Scope const& scope, bool returnNoneOnUnknownOpString = false,
108 std::unordered_map<std::string, storm::expressions::Variable> const& auxiliaryVariables = {});
109 std::vector<storm::expressions::Expression> parseBinaryExpressionArguments(
110 storm::json<ValueType> const& expressionStructure, std::string const& opstring, Scope const& scope, bool returnNoneOnUnknownOpString = false,
111 std::unordered_map<std::string, storm::expressions::Variable> const& auxiliaryVariables = {});
112
113 std::vector<std::shared_ptr<storm::logic::Formula const>> parseUnaryFormulaArgument(storm::jani::Model& model,
114 storm::json<ValueType> const& propertyStructure,
115 storm::logic::FormulaContext formulaContext,
116 std::string const& opstring, Scope const& scope);
117 std::vector<std::shared_ptr<storm::logic::Formula const>> parseBinaryFormulaArguments(storm::jani::Model& model,
118 storm::json<ValueType> const& propertyStructure,
119 storm::logic::FormulaContext formulaContext,
120 std::string const& opstring, Scope const& scope);
121 storm::jani::PropertyInterval parsePropertyInterval(storm::json<ValueType> const& piStructure, Scope const& scope);
122 storm::logic::RewardAccumulation parseRewardAccumulation(storm::json<ValueType> const& accStructure, std::string const& context);
123
124 std::shared_ptr<storm::jani::Composition> parseComposition(storm::json<ValueType> const& compositionStructure);
125 storm::expressions::Variable getVariableOrConstantExpression(std::string const& ident, Scope const& scope,
126 std::unordered_map<std::string, storm::expressions::Variable> const& auxiliaryVariables = {});
127
131 storm::json<ValueType> parsedStructure;
135 std::shared_ptr<storm::expressions::ExpressionManager> expressionManager;
136
137 std::set<std::string> labels = {};
138
139 bool allowRecursion = true;
140
142 // Default values -- assumptions from JANI.
144 static const bool defaultVariableTransient;
145
146 static const std::set<std::string> unsupportedOpstrings;
147};
148} // namespace parser
149} // namespace storm
storm::json< ValueType > Json
Definition JaniParser.h:40
std::unordered_map< std::string, storm::jani::Variable const * > VariablesMap
Definition JaniParser.h:37
std::unordered_map< std::string, storm::jani::Constant const * > ConstantsMap
Definition JaniParser.h:38
std::unordered_map< std::string, storm::jani::FunctionDefinition const * > FunctionsMap
Definition JaniParser.h:39
std::vector< storm::jani::Property > PropertyVector
Definition JaniParser.h:36
Contains all file parsers and helper classes.
nlohmann::basic_json< std::map, std::vector, std::string, bool, int64_t, uint64_t, ValueType > json
Definition JsonForward.h:11
#define STORM_PARSERS_API
Property intervals as per Jani Specification.
Definition Property.h:21
FunctionsMap const * globalFunctions
Definition JaniParser.h:64
Scope(Scope const &other)=default
VariablesMap const * localVars
Definition JaniParser.h:65
FunctionsMap const * localFunctions
Definition JaniParser.h:66
VariablesMap const * globalVars
Definition JaniParser.h:63
Scope(std::string description="global", ConstantsMap const *constants=nullptr, VariablesMap const *globalVars=nullptr, FunctionsMap const *globalFunctions=nullptr, VariablesMap const *localVars=nullptr, FunctionsMap const *localFunctions=nullptr)
Definition JaniParser.h:51
Scope refine(std::string const &prependedDescription="") const
Definition JaniParser.h:67
ConstantsMap const * constants
Definition JaniParser.h:62