=====State Machine===== TODO: - ajouter action F appel de fonction (pour implémentation de C uniquement) - ajouter dans l'ID les parenthèses () et " " ////////////////////////////////////////////////////////////////////////////////////////////////////// //Les différents états avec actions sur état 1 :I,sortie4; 2 :I,sortie3:R,sortie4=IN; 3 :I,sortie3:R,sortie4=IN; ////////////////////////////////////////////////////////////////////////////////////////////////////// //Transitions et actions sur transitions 1 -> 2 ?NOT IN; 1 -> 3 ?IN; 3 -> 2 ?NOT IN; 2 -> 3 ?IN; 3 -> 1 ?IN:I,sortie1:S,sortie2; ////////////////////////////////////////////////////////////////////////////////////////////////////// //Transitions avec état d'origine vide pour reset synchrone, actions sur reset ->2 ?SRESET AND IN; ->3 ?SRESET AND NOT IN: I,sortie2: R,sortie5=entree2; grammar States; r : line+ ; //a state machine is many lines line : state | transition | reset_transition ; state : id (':' action)* ';' ; //state (with action(s)) action : (action_type ',')? ID ('=' expression)? ; action_type : 'R' | 'S' | 'I' | 'F'; transition : id '->' id ('?' condition)? (':' action)* ';' ; //transition (with action(s)) reset_transition : '->' id ('?' condition)? (':' action)* ';' ; //transition (with action(s)) condition : id ( id)* ; expression : id ( id)* ; id : ID | STRING | HTML_STRING | NUMBER ; /** "a numeral [-]?(.[0-9]+ | [0-9]+(.[0-9]*)? )" */ NUMBER : '-'? ( '.' DIGIT+ | DIGIT+ ( '.' DIGIT* )? ) ; fragment DIGIT : [0-9] ; /** "any double-quoted string ("...") possibly containing escaped quotes" */ STRING : '"' ( '\\"' | . )*? '"' ; /** "Any string of alphabetic ([a-zA-Z\200-\377]) characters, underscores * ('_') or digits ([0-9]), not beginning with a digit" */ ID : LETTER ( LETTER | DIGIT )* ; /* ID_WITH_SPACE : LETTER ( ' ' | LETTER | DIGIT )* ; */ fragment LETTER : [a-zA-Z\u0080-\u00FF_] ; /** "HTML strings, angle brackets must occur in matched pairs, and * unescaped newlines are allowed." */ HTML_STRING : '<' ( TAG | ~ [<>] )* '>' ; fragment TAG : '<' .*? '>' ; COMMENT : '/*' .*? '*/' -> skip ; LINE_COMMENT : '//' .*? '\r'? '\n' -> skip ; /** "a '#' character is considered a line output from a C preprocessor (e.g., * # 34 to indicate line 34 ) and discarded" */ PREPROC : '#' .*? '\n' -> skip ; WS : [ \t\n\r]+ -> skip ; BlockComment : '/*' .*? '*/' -> skip ; LineComment : '//' ~[\r\n]* -> skip ; digraph finite_state_machine { rankdir=LR; size="10" ////////////////////////////////////////////////////////////////////////////////////////////////////// 1 [shape=doublecircle]; //définit l'action sur état a1 [shape=box,label= <
Isortie4
> ]; //attache l'action sur état 1 ->a1 [arrowhead=none] ; ////////////////////////////////////////////////////////////////////////////////////////////////////// 2 [shape = circle]; ////////////////////////////////////////////////////////////////////////////////////////////////////// 3 [shape = circle]; //définit l'action sur état a3[shape=box,label= <
Isortie3
Rsortie4=IN
> ]; //attache l'action sur état 3 ->a3[arrowhead=none]; ////////////////////////////////////////////////////////////////////////////////////////////////////// //état vide pour origine reset synchrone node [shape=box] SRESET1 [shape=box, style="invis" ] SRESET2 [shape=box, style="invis" ] SRESET1->2 [style="dashed", shape=box, label= <
SRESET AND IN
> ]; SRESET2->3 [style="dashed", shape=box, label= <
SRESET AND NOT IN
Isortie2
Rsortie5=entree2
> ]; ////////////////////////////////////////////////////////////////////////////////////////////////////// //Actions sur transitions 1 -> 2 [label= <
NOT IN
> ]; 1 -> 3 [label= <
IN
> ]; 3 -> 2 [label= <
NOT IN
> ]; 2 -> 3 [label= <
IN
> ]; 3 -> 1[label= <
IN
Isortie1
Ssortie2
> ]; }
====Affichage par module Graphviz du dokuwiki==== digraph finite_state_machine { rankdir=TB; size="10" ////////////////////////////////////////////////////////////////////////////////////////////////////// 1 [shape=doublecircle]; //définit l'action sur état a1 [shape=box,label= <
Isortie4
> ]; //attache l'action sur état 1 ->a1 [arrowhead=none] ; ////////////////////////////////////////////////////////////////////////////////////////////////////// 2 [shape = circle]; ////////////////////////////////////////////////////////////////////////////////////////////////////// 3 [shape = circle]; //définit l'action sur état a3[shape=box,label= <
Isortie3
Rsortie4=IN
> ]; //attache l'action sur état 3 ->a3[arrowhead=none]; ////////////////////////////////////////////////////////////////////////////////////////////////////// //état vide pour origine reset synchrone node [shape=box] SRESET1 [shape=box, style="invis" ] SRESET2 [shape=box, style="invis" ] SRESET1->2 [style="dashed", shape=box, label= <
SRESET AND IN
> ]; SRESET2->3 [style="dashed", shape=box, label= <
SRESET AND NOT IN
Isortie2
Rsortie5=entree2
> ]; ////////////////////////////////////////////////////////////////////////////////////////////////////// //Actions sur transitions 1 -> 2 [label= <
NOT IN
> ]; 1 -> 3 [label= <
IN
> ]; 3 -> 2 [label= <
NOT IN
> ]; 2 -> 3 [label= <
IN
> ]; 3 -> 1[label= <
IN
Isortie1
Ssortie2
> ]; }
=====Autres===== http://fsmgenerator.sourceforge.net/ ===antlr=== http://www.antlr.org/ quick start linux: sudo su- cd /usr/local/lib wget http://www.antlr.org/download/antlr-4.5.1-complete.jar exit echo "export CLASSPATH=".:/usr/local/lib/antlr-4.5.1-complete.jar:$CLASSPATH"" >>~/.bashrc echo "alias antlr4='java -jar /usr/local/lib/antlr-4.5.1-complete.jar'" >>~/.bashrc echo "alias grun='java org.antlr.v4.gui.TestRig'" >>~/.bashrc video: http://www.youtube.com/watch?v=q8p1voEiu8Q&feature=youtu.be exemple d'utilisation : http://www.youtube.com/watch?v=Bhnw_vexdAI&list=PLCB70903D812AD11A http://www.antlr.org/wiki/display/ANTLR4/Getting+Started+with+ANTLR+v4 il faut java 1.6: http://support.apple.com/kb/dl1359?locale=en_US choix de la version de java: http://superuser.com/questions/490425/how-do-i-switch-between-java-7-and-java-6-on-os-x-10-8-2 /usr/libexec/java_home -v 1.6.0_26 --exec javac -version pour savoir ou est installé la version 1.6 de java /usr/libexec/java_home -v 1.6.0_26 pour lancer java 1.6 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -version du coup les alias à créer pour antlr: export CLASSPATH=".:/usr/local/lib/antlr-4.0-complete.jar:$CLASSPATH" alias antlr4='/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -jar /usr/local/lib/antlr-4.1-complete.jar' alias grun='/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java org.antlr.v4.runtime.misc.TestRig' cd /tmp vim Hello.g4 // Define a grammar called Hello grammar Hello; r : 'hello' ID ; // match keyword hello followed by an identifier ID : [a-z]+ ; // match lower-case identifiers WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines antlr4 Hello.g4 /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/javac Hello*.java grammaire antlr4 pour C: https://github.com/antlr/grammars-v4/commit/15df18159653f7ae2963cc73bec7d2b8939a9363 grammaire antlr3 pour vhdl: http://www.jguru.com/forums/view.jsp?EID=1382922 http://www.antlr3.org/grammar/list.html http://www.antlr3.org/grammar/1086696923011/vhdlams/ http://www.antlr3.org/grammar/1086696923011/vhdlams/vams.g parsing vhdl is very hard: http://eli.thegreenplace.net/2009/05/19/parsing-vhdl-is-very-hard/ ===string template=== http://www.stringtemplate.org/ ======Cours sur les compilateurs===== https://www.cs.fsu.edu/~engelen/courses/COP562105/