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