From f5bf30243ab99efc40802d3d78c08e49839ec9c9 Mon Sep 17 00:00:00 2001 From: Dicee Date: Sun, 15 Mar 2015 14:53:19 +0100 Subject: [PATCH] The last commit --- ModelChecker/src/cfg/Labelizers.scala | 2 +- ModelChecker/src/ctl/CtlExpr.scala | 2 - ModelChecker/src/ctl/ModelChecker.scala | 2 +- ModelChecker/src/graph/GraphNode.scala | 11 +- README.md | 14 +- .../V1/projetLongReport.javatex | 30 -- docs/UserGuide/V1/backup_Fabien_part.txt | 134 +++++++++ docs/UserGuide/V1/user-guide.javatex | 135 +-------- docs/UserGuide/V1/user-guide.pdf | Bin 281670 -> 249051 bytes docs/UserGuide/V1/user-guide.tex | 284 +++++------------- 10 files changed, 220 insertions(+), 394 deletions(-) create mode 100644 docs/UserGuide/V1/backup_Fabien_part.txt diff --git a/ModelChecker/src/cfg/Labelizers.scala b/ModelChecker/src/cfg/Labelizers.scala index a5e154b..26bddea 100644 --- a/ModelChecker/src/cfg/Labelizers.scala +++ b/ModelChecker/src/cfg/Labelizers.scala @@ -17,7 +17,7 @@ * under the License. * * Author(s) : - * - Zohour Abouakil + * - Zohour Abouakil * - David Courtinot * - Xiaowen Ji */ diff --git a/ModelChecker/src/ctl/CtlExpr.scala b/ModelChecker/src/ctl/CtlExpr.scala index 76fcd4f..15f280d 100644 --- a/ModelChecker/src/ctl/CtlExpr.scala +++ b/ModelChecker/src/ctl/CtlExpr.scala @@ -25,8 +25,6 @@ package ctl import scala.reflect.runtime.universe._ -import java.util.function.Consumer - /** * This file defines the CTL language that we will be using for evaluating properties on any graph. diff --git a/ModelChecker/src/ctl/ModelChecker.scala b/ModelChecker/src/ctl/ModelChecker.scala index 6a0ed96..68a55ca 100644 --- a/ModelChecker/src/ctl/ModelChecker.scala +++ b/ModelChecker/src/ctl/ModelChecker.scala @@ -98,7 +98,7 @@ class ModelChecker[M <: MetaVariable: TypeTag, N, V <: Value: TypeTag](private v private[ctl] def SAT_AU = SAT_UU(preA)(_,_) private[ctl] def SAT_EU = SAT_UU(preE)(_,_) - // this methods enables to factorize the code of SAT_AU and SAT_EU + // this method enables to factorize the code of SAT_AU and SAT_EU private[ctl] def SAT_UU(f: CheckerResult => CheckerResult)(T1: CheckerResult , T2: CheckerResult) = { var (w,y,x) = (T1,T2,T2) do { diff --git a/ModelChecker/src/graph/GraphNode.scala b/ModelChecker/src/graph/GraphNode.scala index 366b23c..401d439 100644 --- a/ModelChecker/src/graph/GraphNode.scala +++ b/ModelChecker/src/graph/GraphNode.scala @@ -24,12 +24,6 @@ package graph import collection.mutable.{Set => MSet, HashSet => MHSet} -import scala.collection.mutable.{HashSet => MHSet} -import scala.collection.mutable.{Set => MSet} -import scala.collection.mutable.{HashSet => MHSet} -import scala.collection.mutable.{Set => MSet} -import scala.collection.mutable.{HashSet => MHSet} -import scala.collection.mutable.{Set => MSet} /** * This class represents an oriented unweighted graph @@ -71,16 +65,13 @@ class GraphNode[N](val value: N) { override def toString = value.toString - def toDot = addString(new StringBuilder,MSet())(_.toString).toString + def toDot = addString(new StringBuilder,MSet())(_.toString).toString def toDot(name: N => String, label: N => String) = { def escape (s : String) = s.replaceAll("\"","\\\\\"") def formatValue(node: GNode ) = "{%s [label=\"%s\"]}".format(escape(name(node.value)),escape(label(node.value))) addString(new StringBuilder,MSet())(formatValue(_)).toString } - /** - * Search in CFG and print all arcs - * */ private def addString(sb: StringBuilder, set: MSet[GNode])(convert: GNode => String): StringBuilder = { if (set contains this) sb else if (_next.isEmpty) sb.append(convert(this) + "\n") diff --git a/README.md b/README.md index a84a015..f9a998b 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,3 @@ -# Projet mérou +# Projet Mérou - -#####Unify indent space number: - -In Eclipse Settings, choose on the left **Formatter** down **Scala**, and set the **Spaces to indent** to **4**. -![alt text](https://raw.github.com/jxw1102/Projet-merou/master/formatter.png "description") - -#####Configure ScalaStyle for your eclipse: - -Go to **Help -> Install new software** and use this link to install the plugin: ```http://www.scalastyle.org/downloads/luna-0.6.1/site``` - -Follow [this guide](http://www.scalastyle.org/eclipse-getting_started.html) for configuration. \ No newline at end of file + \ No newline at end of file diff --git a/docs/Projet Long Report/V1/projetLongReport.javatex b/docs/Projet Long Report/V1/projetLongReport.javatex index 1633cae..d9b9206 100644 --- a/docs/Projet Long Report/V1/projetLongReport.javatex +++ b/docs/Projet Long Report/V1/projetLongReport.javatex @@ -1386,36 +1386,6 @@ int main(int argc, char** argv) { return 0; } ## ->>>>> paragraph ## - -## ->>> section ## -Extension : Parser CTL -## ->>>> paragraph ## -In order to allow a user using this application without having to enter a CTL property into a scala code, we developped a CTL Parser. \\ -Hence, we just have to write in a console or a text file some CTL property following the CTL syntaxe of our parser, and then start the -application on a C++ code. The CTL syntax of our parser is almost identique to the real CTL syntax (AND and OR for the logicals CTL operators -and some labels name for an assignmentPattern, literal and few others. \\ -The syntax is quite complete because we needed to make sure to enable the user to express everything he needs. -## ->>>> subsection ## -Example -## ->>>>> paragraph ## -Let's take a simple CTL expression : f(x) AND AX g(x,y) \\ -If we would have needed to write it into the scala language in order to test it on some code, we would have written the following line : -## ->>>>> list ## -And(Predicate(ExpressionLabelizer(CallExprPattern(DefinedString(f),Some(List(UndefinedVar(X)))))), \\ -AX(Predicate(ExpressionLabelizer(CallExprPattern(DefinedString(g),Some(List(UndefinedVar(X), UndefinedVar(Y)))))))) -## ->>>>> paragraph ## -And thank to the CTL parser, the user will only have to enter the following property : -## ->>>>> list ## -f(X) AND AX(g(X,Y)) -## >> latex ## \chapter* {Conclusion} ## diff --git a/docs/UserGuide/V1/backup_Fabien_part.txt b/docs/UserGuide/V1/backup_Fabien_part.txt new file mode 100644 index 0000000..325c079 --- /dev/null +++ b/docs/UserGuide/V1/backup_Fabien_part.txt @@ -0,0 +1,134 @@ + +> chapter ## +CTL parser +## +>> section ## +Syntax +## +>>> paragraph ## +Les commentaires ( // ) et sauts de lignes sont autoris�s. +Cependant le parser lit ligne par ligne donc une expression CTL ne peut s'�crire sur plusieurs lignes. +Le fichier doit se terminer par la ligne ".end." +## +>>> subsection ## +CTL +## +>>>> subsubsection ## +n-ary operators +## +>>>>> paragraph ## +OR, AND +## +>>>> subsubsection ## +binary operators +## +>>>>> paragraph ## +A [ \_ U \_ ], E [ \_ U \_ ] +## +>>>> subsubsection ## +unary operators +## +>>>>> paragraph ## +AX( \_ ), AF( \_ ), AG( \_ ), EX( \_ ), EF( \_ ), EG( \_ ) +## +>>>> paragraph ## +Ces operateurs peuvent donc contenir dans les "\_"de nouvelles expressions CTL ou des labelizer ; +il est egalement possible d'�crire directement un labelizer sans passer par un operateur CTL +## +>>>> subsubsection ## +example +## +>>>>> paragraph ## +A [AX( f(x) ) U f(x) ] AND exists x((E [merou U A [exists y(f(x)) U merou ]] OR merou)) +## +>>> subsection ## +Labelizer +## +>>>> paragraph ## +if( exp ), while( exp ), switch( exp ), for( opt(exp) ) : dans le for, l'expression est optionnelle \\ +<... exp : FindExprLabelelizer(exp) \\ +< exp > : MatchExprLabelizer(exp) \\ +def(id1, opt(id2)), decl(id1, opt(id2)) : VarDefPattern & VarDeclPattern (id2 est optionel) \\ +use(id) : UseLabelizer(id) \\ +exp : ExpressionLabelizer -- Il est egalement possible d�ecrire directement une expression \\ +## +>>>> subsubsection ## +example +## +>>>>> paragraph ## +<... 5 + x ; +## +>>> subsection ## +Expression Labelizer +## +>>>> paragraph ## +Dans les expressions, il y a deux types d'ident : expIdent (eId) qui commence par une minuscule, et undefinedVar (uV) +qui est compos� uniquement de majuscules. Tous les operateurs N-aires et binaires (� l'exception de ceux mentionn�s) +sont des BinaryOpPattern et sont compos�s d'exp +## +>>>> subsubsection ## +n-ary operators +## +>>>>> paragraph ## +||, &&, |, \^\ , &, +, -, *, /, \%, op(uV), notin( \_ ) \\ +notin peut contenir un ou plusieurs symboles (separ�s par une virgule) parmi =,++,--,+,-,*,/,\%,void +## +>>>> subsubsection ## +binary operators +## +>>>>> paragraph ## +eId = exp \\ + assign(eId, exp, opt(+=,-=,*=,/=,\%=,&=,|=,\^=,<<=,>>=) ) : AssignmentPattern \\ + eId (+=,-=,*=,/=,\%=,&=,|=,\^=,<<=,>>=) exp : CompoundAssignOpPattern \\ + ==, !=, <=, >=, <, >, <<, >> +## +>>>> subsubsection ## +unary operators +## +>>>>> paragraph ## +exp (++, --, notin(\_)) : UnaryOpPattern \\ +(!, ~, ++, --, +, -, *, &, notin(\_)) exp : UnaryOpPattern \\ +literalExp( uV ), pointerExp( uV ) : LiteralExprPattern, PointerExprPattern \\ +CXXNew( opt(eId, exp) ), CXXDelete( opt(exp) ) : CXXNewExprPattern/CXXDeleteExprPattern +## +>>>> subsubsection ## +function c all +## +>>>>> paragraph ## +Pour la fonctionCall, l�ident peut etre un eId ou uV, de plus, nous aimerions pouvoir specifier si nous voulons +matcher un nombre precis d�argument ou si le nombre d�arguments est n�gligeable : \\ +ident(arg1, arg2, \_) - pouvant contenir 0 ou plusieurs arguments. Matchera le nombre exact d�argument \\ +ident(�,opt(typeOf) - indique que nous regardons pas les arguments ; typeOf specifiant le type de la fonction et pouvant etre un notin +## +>>>> subsubsection ## +example +## +>>>>> paragraph ## +a + b op(W) c notin(=,*,-) d \\ +assign(X,Y,=) \\ +f(x,y) || g(�) +## +>> section ## +Operator priority +## +>>> paragraph ## +Ce parser lit de gauche a droite : a OR b OR c <=> a OR ( b OR c ) \\ +CTL est au plus haut niveau, puis nous avons Labelizer, puis les Expressions. \\ +Pour la partie CTL, le OR est l'operateur lu en premier, suivi de AND puis tous les autres au m�me "niveau". \\ +Ex : x AND y OR z <=> ( x AND y ) OR z \\ +A noter que seul Exists et NOT peuvent contenir les operateur OR et AND : \\ +AX ( x AND y) => IMPOSSSIBLE \\ +Exists x( y OR NOT(a AND b)) => OK \\ +Ensuite les Labelizer sont tous au m�me niveau. \\ +Pour les Expressions, nous nous sommes bas� sur le tablau d'ordre d'operations C++ qui suit : +## +>>> image ## +data/orderOperation; +Order between differents operators in C++ code.; +0.65 +## +>>> paragraph ## +Les op( uV ) et notin( \_ ) etant entre les priorit�s du niveau 2 (unary) et 3 (multiplication..) +Et les literalExp, pointerExp et CXX �tant au niveau 1 (avec fonction call... etc) + +## diff --git a/docs/UserGuide/V1/user-guide.javatex b/docs/UserGuide/V1/user-guide.javatex index 4f5fb24..8110ba0 100644 --- a/docs/UserGuide/V1/user-guide.javatex +++ b/docs/UserGuide/V1/user-guide.javatex @@ -400,137 +400,4 @@ is the same as between VarDeclPattern and VarDefPattern. \item VarDefLabelizer(pattern: VarDefPattern) \end{itemize} \end{itemize} -## -> chapter ## -CTL parser -## ->> section ## -Syntax -## ->>> paragraph ## -Les commentaires ( // ) et sauts de lignes sont autorisés. -Cependant le parser lit ligne par ligne donc une expression CTL ne peut s'écrire sur plusieurs lignes. -Le fichier doit se terminer par la ligne ".end." -## ->>> subsection ## -CTL -## ->>>> subsubsection ## -n-ary operators -## ->>>>> paragraph ## -OR, AND -## ->>>> subsubsection ## -binary operators -## ->>>>> paragraph ## -A [ \_ U \_ ], E [ \_ U \_ ] -## ->>>> subsubsection ## -unary operators -## ->>>>> paragraph ## -AX( \_ ), AF( \_ ), AG( \_ ), EX( \_ ), EF( \_ ), EG( \_ ) -## ->>>> paragraph ## -Ces operateurs peuvent donc contenir dans les "\_"de nouvelles expressions CTL ou des labelizer ; -il est egalement possible d'écrire directement un labelizer sans passer par un operateur CTL -## ->>>> subsubsection ## -example -## ->>>>> paragraph ## -A [AX( f(x) ) U f(x) ] AND exists x((E [merou U A [exists y(f(x)) U merou ]] OR merou)) -## ->>> subsection ## -Labelizer -## ->>>> paragraph ## -if( exp ), while( exp ), switch( exp ), for( opt(exp) ) : dans le for, l'expression est optionnelle \\ -<... exp : FindExprLabelelizer(exp) \\ -< exp > : MatchExprLabelizer(exp) \\ -def(id1, opt(id2)), decl(id1, opt(id2)) : VarDefPattern & VarDeclPattern (id2 est optionel) \\ -use(id) : UseLabelizer(id) \\ -exp : ExpressionLabelizer -- Il est egalement possible d’ecrire directement une expression \\ -## ->>>> subsubsection ## -example -## ->>>>> paragraph ## -<... 5 + x ; -## ->>> subsection ## -Expression Labelizer -## ->>>> paragraph ## -Dans les expressions, il y a deux types d'ident : expIdent (eId) qui commence par une minuscule, et undefinedVar (uV) -qui est composé uniquement de majuscules. Tous les operateurs N-aires et binaires (à l'exception de ceux mentionnés) -sont des BinaryOpPattern et sont composés d'exp -## ->>>> subsubsection ## -n-ary operators -## ->>>>> paragraph ## -||, &&, |, \^\ , &, +, -, *, /, \%, op(uV), notin( \_ ) \\ -notin peut contenir un ou plusieurs symboles (separés par une virgule) parmi =,++,--,+,-,*,/,\%,void -## ->>>> subsubsection ## -binary operators -## ->>>>> paragraph ## -eId = exp \\ - assign(eId, exp, opt(+=,-=,*=,/=,\%=,&=,|=,\^=,<<=,>>=) ) : AssignmentPattern \\ - eId (+=,-=,*=,/=,\%=,&=,|=,\^=,<<=,>>=) exp : CompoundAssignOpPattern \\ - ==, !=, <=, >=, <, >, <<, >> -## ->>>> subsubsection ## -unary operators -## ->>>>> paragraph ## -exp (++, --, notin(\_)) : UnaryOpPattern \\ -(!, ~, ++, --, +, -, *, &, notin(\_)) exp : UnaryOpPattern \\ -literalExp( uV ), pointerExp( uV ) : LiteralExprPattern, PointerExprPattern \\ -CXXNew( opt(eId, exp) ), CXXDelete( opt(exp) ) : CXXNewExprPattern/CXXDeleteExprPattern -## ->>>> subsubsection ## -function c all -## ->>>>> paragraph ## -Pour la fonctionCall, l’ident peut etre un eId ou uV, de plus, nous aimerions pouvoir specifier si nous voulons -matcher un nombre precis d’argument ou si le nombre d’arguments est négligeable : \\ -ident(arg1, arg2, \_) - pouvant contenir 0 ou plusieurs arguments. Matchera le nombre exact d’argument \\ -ident(…,opt(typeOf) - indique que nous regardons pas les arguments ; typeOf specifiant le type de la fonction et pouvant etre un notin -## ->>>> subsubsection ## -example -## ->>>>> paragraph ## -a + b op(W) c notin(=,*,-) d \\ -assign(X,Y,=) \\ -f(x,y) || g(…) -## ->> section ## -Operator priority -## ->>> paragraph ## -Ce parser lit de gauche a droite : a OR b OR c <=> a OR ( b OR c ) \\ -CTL est au plus haut niveau, puis nous avons Labelizer, puis les Expressions. \\ -Pour la partie CTL, le OR est l'operateur lu en premier, suivi de AND puis tous les autres au même "niveau". \\ -Ex : x AND y OR z <=> ( x AND y ) OR z \\ -A noter que seul Exists et NOT peuvent contenir les operateur OR et AND : \\ -AX ( x AND y) => IMPOSSSIBLE \\ -Exists x( y OR NOT(a AND b)) => OK \\ -Ensuite les Labelizer sont tous au même niveau. \\ -Pour les Expressions, nous nous sommes basé sur le tablau d'ordre d'operations C++ qui suit : -## ->>> image ## -data/orderOperation; -Order between differents operators in C++ code.; -0.65 -## ->>> paragraph ## -Les op( uV ) et notin( \_ ) etant entre les priorités du niveau 2 (unary) et 3 (multiplication..) -Et les literalExp, pointerExp et CXX étant au niveau 1 (avec fonction call... etc) - -## +## \ No newline at end of file diff --git a/docs/UserGuide/V1/user-guide.pdf b/docs/UserGuide/V1/user-guide.pdf index e993be2a3290d82db5133a8853adf2ef2ea5e844..a5afe8029a31a6d49111fa169c6384578e014f05 100644 GIT binary patch delta 33977 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 VUS3DZDc%=p!K-)gKK}ga>OUWAv!DO~ delta 64226 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 Lvu5i~ZJhoO3K5?8 diff --git a/docs/UserGuide/V1/user-guide.tex b/docs/UserGuide/V1/user-guide.tex index 9d0b15d..ada39d6 100644 --- a/docs/UserGuide/V1/user-guide.tex +++ b/docs/UserGuide/V1/user-guide.tex @@ -166,22 +166,22 @@ \restoregeometry \tableofcontents \newgeometry{left=2.1cm,right=2.1cm} -%\section*{Changelog} -%\begin{center} -%\begin{tabular}{|c|l|l|} - %\hline - %Version & Date & Change \\ - %\hline - %V1 & March, $6^{nd}$ 2015 & first version \\ - %\hline -%\end{tabular} +%\section*{Changelog} +%\begin{center} +%\begin{tabular}{|c|l|l|} + %\hline + %Version & Date & Change \\ + %\hline + %V1 & March, $6^{nd}$ 2015 & first version \\ + %\hline +%\end{tabular} %\end{center} \chapter{Provided features} \paragraph{} -\hspace{4mm}In this guide, we will keep referring to our project that can be found on Github : -\textit{https://github.com/jxw1102/Projet-merou}. -In this part, we will describe the packages composing our project, their role and mutual dependencies as well as +\hspace{4mm}In this guide, we will keep referring to our project that can be found on Github : +\textit{https://github.com/jxw1102/Projet-merou}. +In this part, we will describe the packages composing our project, their role and mutual dependencies as well as the other provided scripts or documentation. \section{Packages overview} @@ -252,15 +252,15 @@ \subsection{Release script} \subsection{Documentation} \paragraph{} -\hspace{4mm}The scaladoc of the project can be found in \textit{Projet-merou/ModelChecker/doc.jar}. For the most curious, -\textit{Projet-merou/docs/Architecture\ document} contain all the versions of our architecture (some of them may not be complete, just consult the latest version). +\hspace{4mm}The scaladoc of the project can be found in \textit{Projet-merou/ModelChecker/doc.jar}. For the most curious, +\textit{Projet-merou/docs/Architecture\ document} contain all the versions of our architecture (some of them may not be complete, just consult the latest version). Please note that it deeply dives into the implementation details and is not necessary to use the application. \chapter{How to construct a CTL expression} \paragraph{} -\hspace{4mm}A CTL expression is a combination of predicates - elementary properties - and temporal connectors as AX, AF. - Temporal connectors are implemented as they are defined in the provided papers. In total, the following connectors are available +\hspace{4mm}A CTL expression is a combination of predicates - elementary properties - and temporal connectors as AX, AF. + Temporal connectors are implemented as they are defined in the provided papers. In total, the following connectors are available (some as classes, the others as implicit declarations in the ctl package object) : \vspace{1.5mm} @@ -273,30 +273,30 @@ \chapter{How to construct a CTL expression} \end{itemize} \paragraph{} -\hspace{4mm}A predicate is an atomic CTL expression that expresses properties - like << \textit{This node is a function call with one parameter} >> or << \textit{This node is an if statement condition matches the X > Y pattern} >> (we will soon detail -how patterns work). Predicates are evaluated on every node of the graph. More precisely, the evaluation of a property on a node +\hspace{4mm}A predicate is an atomic CTL expression that expresses properties + like << \textit{This node is a function call with one parameter} >> or << \textit{This node is an if statement condition matches the X > Y pattern} >> (we will soon detail +how patterns work). Predicates are evaluated on every node of the graph. More precisely, the evaluation of a property on a node is actually done by a Labelizer, wrapped by a Predicate. For example, we would write the second example as \lstinline|Predicate(IfLabelizer(BinaryOpPattern(...)))|. \section{Patterns} \paragraph{} -\hspace{4mm}We brielfy introduced the notion of a \textit{labelizer} as well as the notion of a \textit{pattern}. Most of the time, a labelizer (extending the Labelizer abstract class) takes a pattern -(extending the Pattern trait) as a parameter. Therefore, let's first what pattern are done for and how to use them. A pattern represents a basic syntactic property of the code. In terms of logic, -it can be considered as a predicate but please note that a Pattern is never a Predicate in our program, as it is missing some semantic information (we will detail it in further details later). -As an example, X + 1 is a pattern describing certain expressions. By convention, we will use upper-case letters for the meta-variables, a lower-case word will designate an identifier in the code. A good comparison to get the idea is the regex \lstinline|(?.+)\+1| (using the Java capturing named groups (?regex)). -This regex accepts any string containing a \lstinline|'+'| character with a non-empty substring at its left and a \lstinline|'1'| at its right. Moreover, thanks to the named groupe X, +\hspace{4mm}We brielfy introduced the notion of a \textit{labelizer} as well as the notion of a \textit{pattern}. Most of the time, a labelizer (extending the Labelizer abstract class) takes a pattern +(extending the Pattern trait) as a parameter. Therefore, let's first what pattern are done for and how to use them. A pattern represents a basic syntactic property of the code. In terms of logic, +it can be considered as a predicate but please note that a Pattern is never a Predicate in our program, as it is missing some semantic information (we will detail it in further details later). +As an example, X + 1 is a pattern describing certain expressions. By convention, we will use upper-case letters for the meta-variables, a lower-case word will designate an identifier in the code. A good comparison to get the idea is the regex \lstinline|(?.+)\+1| (using the Java capturing named groups (?regex)). +This regex accepts any string containing a \lstinline|'+'| character with a non-empty substring at its left and a \lstinline|'1'| at its right. Moreover, thanks to the named groupe X, it enables to extract the value of the right member. This is also the behaviour of our patterns : \vspace{1.5mm} \begin{itemize} \item check that the "regex" is matched\vspace{1mm} -\item return the "groups", namely the bindings between the meta-variables of the pattern and the corresponding +\item return the "groups", namely the bindings between the meta-variables of the pattern and the corresponding matched values. This is a bit more subtle here, because the bindigs have to be compatible, but the basic idea is the same\vspace{1mm} \end{itemize} \paragraph{} -\hspace{4mm}We will now detail the architecture of the Pattern type, summed up by the following class diagaram (leaves classes are not presented on it, +\hspace{4mm}We will now detail the architecture of the Pattern type, summed up by the following class diagaram (leaves classes are not presented on it, we just kept the traits and abstract classes) : \begin{center} @@ -315,31 +315,28 @@ \subsubsection{Different types of atomic patterns} \begin{itemize} \item defined values : it concerns DefinedExpr and DefinedString. Use defined values when you want to see specific values in the code entity (declaration or expression) your are trying to match with a pattern. There will be pratical examples of it later.\vspace{1mm} \item forbidden values : it concerns NotString. Use it when you want to disallow certain values in the entity you are matching.\vspace{1mm} -\item meta-variables : it concerns UndefinedVar. It is the only atomic pattern that returns a (positive) binding in case of a successful match. UndefinedVar takes a meta-variable as a parameter, -which will be the meta-variable involved in the eventually returned binding. Finally, please note that this is, to keep with the regex metaphor, equivalent to (?.*). To be clear, it means that it matches +\item meta-variables : it concerns UndefinedVar. It is the only atomic pattern that returns a (positive) binding in case of a successful match. UndefinedVar takes a meta-variable as a parameter, +which will be the meta-variable involved in the eventually returned binding. Finally, please note that this is, to keep with the regex metaphor, equivalent to (?.*). To be clear, it means that it matches anything with no constraint and captures the whole entity as a group.\vspace{1mm} \end{itemize} \subsubsection{Use-cases and examples} -\paragraph{} -\hspace{4mm}title=DefinedString +\paragraph{DefinedString} You can use it when you want to get the definition of all the variables of a specific type (let's say int), which will be noted \lstinline|DefinedSring("int")|. This will have to be composed with a VarDefPattern, as we will see it. \paragraph{NotString} -You can use it when you want to get the function calls which return type is -different from \lstinline[language=java]|void| or \lstinline[language=java]|void *|, which will be expressed with +You can use it when you want to get the function calls which return type is +different from \lstinline[language=java]|void| or \lstinline[language=java]|void *|, which will be expressed with \lstinline|NotString("void","void *")|. This will have to be composed with a CallExprPattern. -\paragraph{} -\hspace{4mm}title=DefinedExpr +\paragraph{DefinedExpr} You can use it if you want to find all the expressions using a variable called \textit{x} : \lstinline|DefinedExpr(DeclRefExpr("","x","",""))|. \textbf{Be careful}, the match operation on a DefinedExpr will always ignore the type of the expression as well as the Clang id. Consequently, it is for example impossible to find all expressions using a variable called \textit{x} of type \lstinline|double|. -\paragraph{} -\hspace{4mm}title=UndefinedVar +\paragraph{UndefinedVar} Use it when you want to return a binding between a meta-variable and the value of a "matched group" (cf regex). \subsection{Composed patterns} @@ -354,8 +351,7 @@ \subsubsection{ExprPattern : recursive patterns} \paragraph{} \hspace{4mm}The recursive expression patterns are listed below : -\paragraph{} -\hspace{4mm}title=CompoundAssignOpPattern, BinaryOpPattern and UnaryOpPattern +\paragraph{CompoundAssignOpPattern, BinaryOpPattern and UnaryOpPattern} These patterns respectively match CompoundAssignOp, BinaryOp and UnaryOp expressions. \begin{itemize} \item{\textbf{Syntax : }} @@ -370,8 +366,7 @@ \subsubsection{ExprPattern : recursive patterns} \lstinline|BinaryOp(Literal("int", "3"), Literal("int", "2"), "==")| matches \lstinline|BinaryOpPattern(UndefinedVar("X"), Literal("int", "2"), "==")| and returns the environment \{ X $\rightarrow$ \lstinline|CFGExpr(Literal("int", "3"))| \}. \end{itemize} -\paragraph{} -\hspace{4mm}title=AssignmentPattern +\paragraph{AssignmentPattern} This pattern is a convenient pattern to represent assignments. It basically uses CompoundAssignOpPattern and BinaryOpPattern. \begin{itemize} \item{\textbf{Syntax : }} AssignmentPattern(left: ExprPattern, right: ExprPattern, op: StringPattern=NotString()). ~\\~\\ @@ -384,8 +379,7 @@ \subsubsection{ExprPattern : recursive patterns} \end{itemize} \end{itemize} -\paragraph{} -\hspace{4mm}title=CallExprPattern +\paragraph{CallExprPattern} It matches a function call (CallExpr) and takes three arguments : \begin{itemize} \item{\textbf{Syntax : }} ~\\~\\ @@ -435,37 +429,36 @@ \subsubsection{DeclPattern : non-recursive composed patterns} \section{Labelizers} \paragraph{} -\hspace{4mm}As we said it before, a Labelizer most of the time wraps a Pattern adding to it a specific semantic. -A Labelizer is applied on a node of the CFG, which can be a For(expr: Expr), While(expr: Expr), Switch(expr: Expr), If(expr: Expr), Expression(expr: Expr), Statement(\_) (it is not mportant in this guide to explain what a Statement contains). +\hspace{4mm}As we said it before, a Labelizer most of the time wraps a Pattern adding to it a specific semantic. +A Labelizer is applied on a node of the CFG, which can be a For(expr: Expr), While(expr: Expr), Switch(expr: Expr), If(expr: Expr), Expression(expr: Expr), Statement(\_) (it is not mportant in this guide to explain what a Statement contains). Before listing our labelizers, we will detail the semantic of these nodes : -\begin{itemize} - \item{For(Option[expr]) :} corresponds to \lstinline[language=java]|for( ... ; expr? ; ... )| in the source code - \item{While(expr) :} corresponds to \lstinline[language=java]|while (expr)| in the source code - \item{If(expr) :} corresponds to \lstinline[language=java]|if (expr)| in the source code - \item{Switch(expr) :} corresponds to \lstinline[language=java]|switch (expr)| in the source code - \item{Expression(expr) :} corresponds to \lstinline[language=java]|expr| in the source code (an assignment for example) - \item{Statement(expr) :} corresponds to any other kind of statement. Most of the time, it will be a declaration. +\begin{itemize} + \item{For(Option[expr]) :} corresponds to \lstinline[language=java]|for( ... ; expr? ; ... )| in the source code + \item{While(expr) :} corresponds to \lstinline[language=java]|while (expr)| in the source code + \item{If(expr) :} corresponds to \lstinline[language=java]|if (expr)| in the source code + \item{Switch(expr) :} corresponds to \lstinline[language=java]|switch (expr)| in the source code + \item{Expression(expr) :} corresponds to \lstinline[language=java]|expr| in the source code (an assignment for example) + \item{Statement(expr) :} corresponds to any other kind of statement. Most of the time, it will be a declaration. \end{itemize} Now, here are listed the labelizers we implemented : \paragraph{IfLabelizer, WhileLabelizer, SwitchLabelizer, ForLabelizer and ExpressionLabelizer} -Those labelizers test the type of the node and additionally try to match the expression it contains with -an ExprPattern taken as a parameter. -\begin{itemize} - \item{\textbf{Syntax :}} - \begin{itemize} - \item IfLabelizer(pattern: ExprPattern) - \item WhileLabelizer(pattern: ExprPattern) - \item SwitchLabelizer(pattern: ExprPattern) - \item ForLabelizer(pattern: Option[ExprPattern]) - \item ExpressionLabelizer(pattern: ExprPattern) - \end{itemize} - \item{\textbf{Note :}} ForLabelizer is a bit particular as it takes an ExprPattern as a parameter. It is simply to handle the case when there is no condition - in the \textit{for} statement. In this case, \textit{pattern} has to be None. +Those labelizers test the type of the node and additionally try to match the expression it contains with +an ExprPattern taken as a parameter. +\begin{itemize} + \item{\textbf{Syntax :}} + \begin{itemize} + \item IfLabelizer(pattern: ExprPattern) + \item WhileLabelizer(pattern: ExprPattern) + \item SwitchLabelizer(pattern: ExprPattern) + \item ForLabelizer(pattern: Option[ExprPattern]) + \item ExpressionLabelizer(pattern: ExprPattern) + \end{itemize} + \item{\textbf{Note :}} ForLabelizer is a bit particular as it takes an ExprPattern as a parameter. It is simply to handle the case when there is no condition + in the \textit{for} statement. In this case, \textit{pattern} has to be None. \end{itemize} -\paragraph{} -\hspace{4mm}title=FindExprLabelizer, MatchExprLabelizer +\paragraph{FindExprLabelizer, MatchExprLabelizer} Those two labelizers ignore the type of the node and simply focus on the expression it contains, if any. If the given pattern is matched, those labelizers could accept For, While etc. and even Statement nodes (indeed, a variable declaration can contain an assignment). The difference between them is that Find will try to find a match in every sub-expression of the input expression whereas the Match will stop at the root of the expression. @@ -482,146 +475,29 @@ \section{Labelizers} \end{itemize} \paragraph{UseLabelizer} -This labelizer returns all the variables (in form of a CFGDecl) which value is used in a node -\begin{itemize} - \item{\textbf{Syntax :}} - \begin{itemize} - \item UseLabelizer(pattern: StringPattern) - \end{itemize} - \item{\textbf{Examples :}} - \begin{itemize} - \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(NotString())| and will return $\top$ - \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(UndefinedVar("X"))| and will return (the ids and types are invented for the example) Set(\{ X $\rightarrow$ \lstinline|CFGDecl("0x256f4a0","float","z")| \}, \{ X $\rightarrow$ \lstinline|CFGDecl("0xbc450d","int","y")| \}) - \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(DefinedString("y"))| and will return $\top$ - \end{itemize} +This labelizer returns all the variables (in form of a CFGDecl) which value is used in a node +\begin{itemize} + \item{\textbf{Syntax :}} + \begin{itemize} + \item UseLabelizer(pattern: StringPattern) + \end{itemize} + \item{\textbf{Examples :}} + \begin{itemize} + \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(NotString())| and will return $\top$ + \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(UndefinedVar("X"))| and will return (the ids and types are invented for the example) Set(\{ X $\rightarrow$ \lstinline|CFGDecl("0x256f4a0","float","z")| \}, \{ X $\rightarrow$ \lstinline|CFGDecl("0xbc450d","int","y")| \}) + \item the code \lstinline[language=java]|x = z + y + 3| will produce an Expression node that will be accepted by \lstinline|UseLabelizer(DefinedString("y"))| and will return $\top$ + \end{itemize} \end{itemize} -\paragraph{VarDeclLabelizer and VarDefLabelizer } -Those labelizers only recognize Statement nodes containing a variable declaration (VarDecl). The difference between them -is the same as between VarDeclPattern and VarDefPattern. -\begin{itemize} - \item{\textbf{Syntax :}} - \begin{itemize} - \item VarDeclLabelizer(pattern: VarDeclPattern) - \item VarDefLabelizer(pattern: VarDefPattern) - \end{itemize} +\paragraph{VarDeclLabelizer and VarDefLabelizer} +Those labelizers only recognize Statement nodes containing a variable declaration (VarDecl). The difference between them +is the same as between VarDeclPattern and VarDefPattern. +\begin{itemize} + \item{\textbf{Syntax :}} + \begin{itemize} + \item VarDeclLabelizer(pattern: VarDeclPattern) + \item VarDefLabelizer(pattern: VarDefPattern) + \end{itemize} \end{itemize} -\chapter{CTL parser} - -\section{Syntax} - -\paragraph{} -\hspace{4mm}Les commentaires ( // ) et sauts de lignes sont autorisés. -Cependant le parser lit ligne par ligne donc une expression CTL ne peut s'écrire sur plusieurs lignes. -Le fichier doit se terminer par la ligne ".end." - -\subsection{CTL} - -\subsubsection{n-ary operators} - -\paragraph{} -\hspace{4mm}OR, AND - -\subsubsection{binary operators} - -\paragraph{} -\hspace{4mm}A [ \_ U \_ ], E [ \_ U \_ ] - -\subsubsection{unary operators} - -\paragraph{} -\hspace{4mm}AX( \_ ), AF( \_ ), AG( \_ ), EX( \_ ), EF( \_ ), EG( \_ ) - -\paragraph{} -\hspace{4mm}Ces operateurs peuvent donc contenir dans les "\_"de nouvelles expressions CTL ou des labelizer ; -il est egalement possible d'écrire directement un labelizer sans passer par un operateur CTL - -\subsubsection{example} - -\paragraph{} -\hspace{4mm}A [AX( f(x) ) U f(x) ] AND exists x((E [merou U A [exists y(f(x)) U merou ]] OR merou)) - -\subsection{Labelizer} - -\paragraph{} -\hspace{4mm}if( exp ), while( exp ), switch( exp ), for( opt(exp) ) : dans le for, l'expression est optionnelle \\ -<... exp : FindExprLabelelizer(exp) \\ -< exp > : MatchExprLabelizer(exp) \\ -def(id1, opt(id2)), decl(id1, opt(id2)) : VarDefPattern \& VarDeclPattern (id2 est optionel) \\ -use(id) : UseLabelizer(id) \\ -exp : ExpressionLabelizer -- Il est egalement possible d’ecrire directement une expression \\ - -\subsubsection{example} - -\paragraph{} -\hspace{4mm}<... 5 + x ; - -\subsection{Expression Labelizer} - -\paragraph{} -\hspace{4mm}Dans les expressions, il y a deux types d'ident : expIdent (eId) qui commence par une minuscule, et undefinedVar (uV) -qui est composé uniquement de majuscules. Tous les operateurs N-aires et binaires (à l'exception de ceux mentionnés) -sont des BinaryOpPattern et sont composés d'exp - -\subsubsection{n-ary operators} - -\paragraph{} -\hspace{4mm}||, \&\&, |, \^\ , \&, +, -, *, /, \%, op(uV), notin( \_ ) \\ -notin peut contenir un ou plusieurs symboles (separés par une virgule) parmi =,++,--,+,-,*,/,\%,void - -\subsubsection{binary operators} - -\paragraph{} -\hspace{4mm}eId = exp \\ - assign(eId, exp, opt(+=,-=,*=,/=,\%=,\&=,|=,\^=,<<=,>>=) ) : AssignmentPattern \\ - eId (+=,-=,*=,/=,\%=,\&=,|=,\^=,<<=,>>=) exp : CompoundAssignOpPattern \\ - ==, !=, <=, >=, <, >, <<, >> - -\subsubsection{unary operators} - -\paragraph{} -\hspace{4mm}exp (++, --, notin(\_)) : UnaryOpPattern \\ -(!, ~, ++, --, +, -, *, \&, notin(\_)) exp : UnaryOpPattern \\ -literalExp( uV ), pointerExp( uV ) : LiteralExprPattern, PointerExprPattern \\ -CXXNew( opt(eId, exp) ), CXXDelete( opt(exp) ) : CXXNewExprPattern/CXXDeleteExprPattern - -\subsubsection{function c all} - -\paragraph{} -\hspace{4mm}Pour la fonctionCall, l’ident peut etre un eId ou uV, de plus, nous aimerions pouvoir specifier si nous voulons -matcher un nombre precis d’argument ou si le nombre d’arguments est négligeable : \\ -ident(arg1, arg2, \_) - pouvant contenir 0 ou plusieurs arguments. Matchera le nombre exact d’argument \\ -ident(…,opt(typeOf) - indique que nous regardons pas les arguments ; typeOf specifiant le type de la fonction et pouvant etre un notin - -\subsubsection{example} - -\paragraph{} -\hspace{4mm}a + b op(W) c notin(=,*,-) d \\ -assign(X,Y,=) \\ -f(x,y) || g(…) - -\section{Operator priority} - -\paragraph{} -\hspace{4mm}Ce parser lit de gauche a droite : a OR b OR c <=> a OR ( b OR c ) \\ -CTL est au plus haut niveau, puis nous avons Labelizer, puis les Expressions. \\ -Pour la partie CTL, le OR est l'operateur lu en premier, suivi de AND puis tous les autres au même "niveau". \\ -Ex : x AND y OR z <=> ( x AND y ) OR z \\ -A noter que seul Exists et NOT peuvent contenir les operateur OR et AND : \\ -AX ( x AND y) => IMPOSSSIBLE \\ -Exists x( y OR NOT(a AND b)) => OK \\ -Ensuite les Labelizer sont tous au même niveau. \\ -Pour les Expressions, nous nous sommes basé sur le tablau d'ordre d'operations C++ qui suit : - -\begin{center} -\includegraphics[scale=0.65]{data/orderOperation} -~\\~\\Figure III.1 - Order between differents operators in C++ code. -\end{center} - -\paragraph{} -\hspace{4mm}Les op( uV ) et notin( \_ ) etant entre les priorités du niveau 2 (unary) et 3 (multiplication..) -Et les literalExp, pointerExp et CXX étant au niveau 1 (avec fonction call... etc) - - \end{document}