Oi Denis,
E ai, deu certo?
Hoje tive umas horinhas de folga e aproveitei para modelar no ANTLR a linguagem que você apresentou.
Segue o código:
Estou preparando um projetinho no NetBeans para usá-la.
[code]/**
- Gramática para o reconhecimento da linguagem de representação
- de um autômato finito determinístico.
-
- Exemplo:
-
- digraph D {
- rankdir=LR;
- start [shape=point];
-
start > 0;
-
0 > 0 [label=a];
-
0 > 1 [label=b];
-
1 > 0 [label=a];
-
1 > 1 [label=b];
-
0 [peripheries=2];
- }
*/
grammar DFA;
@header {
import java.util.Map;
import java.util.HashMap;
import parserdfa.dfa.*;
}
@members{
private Estado estadoInicial;
private Map<String, Estado> memoriaEstados = new HashMap<String, Estado>();
}
prog[boolean printMap] returns[parserdfa.dfa.DFA d]
: DIGRAPH DIGRAPH_NAME {
$d = new parserdfa.dfa.DFA( $DIGRAPH_NAME.text );
} L_CURV header transitions R_CURV {
$d.setEstadoInicial( estadoInicial );
if ( printMap ) {
for ( Map.Entry<String, Estado> e : memoriaEstados.entrySet() ) {
System.out.println( e.getValue() + "\n" );
}
}
};
header : rankdirExp startExp;
rankdirExp : RANKDIR EQ RANKDIR_TYPES SEMICOLON;
startExp : START L_BRAC SHAPE EQ SHAPE_TYPES R_BRAC SEMICOLON;
transitions : startTransitionExp transitionExp+ aceptStateExp+;
startTransitionExp : START T_OPER STATE_NAME {
estadoInicial = new Estado( $STATE_NAME.text );
estadoInicial.setInicial( true );
memoriaEstados.put( $STATE_NAME.text, estadoInicial );
} SEMICOLON;
transitionExp : stateL {
Estado eL = memoriaEstados.get( $stateL.text );
if ( eL == null ) {
eL = new Estado( $stateL.text );
memoriaEstados.put( $stateL.text, eL );
}
} T_OPER stateR {
Estado eR = memoriaEstados.get( $stateR.text );
if ( eR == null ) {
eR = new Estado( $stateR.text );
memoriaEstados.put( $stateR.text, eR );
}
} L_BRAC LABEL EQ LABEL_VALUE {
Transicao t = new Transicao( $LABEL_VALUE.text, eL, eR );
eL.addTransicao( t );
} R_BRAC SEMICOLON;
aceptStateExp : stateL {
Estado eFinal = memoriaEstados.get( $stateL.text );
if ( eFinal != null ) {
eFinal.setFinal( true );
}
} L_BRAC PERIPHERIES EQ stateR {
// código para tratar as periferias
// não sei o que são as tais das periferias no seu código.
} R_BRAC SEMICOLON;
stateL : STATE_NAME;
stateR : STATE_NAME;
RANKDIR : ‘rankdir’;
DIGRAPH : ‘digraph’;
START : ‘start’;
SHAPE : ‘shape’;
LABEL : ‘label’;
PERIPHERIES : ‘peripheries’;
RANKDIR_TYPES : ‘LR’|‘LL’;
DIGRAPH_NAME : ‘A’…‘Z’+;
SHAPE_TYPES : ‘point’|‘ellipse’;
LABEL_VALUE : ‘a’…‘z’;
STATE_NAME : ‘0’…‘9’+;
L_CURV : ‘{’;
R_CURV : ‘}’;
L_BRAC : ‘[’;
R_BRAC : ‘]’;
EQ : ‘=’;
SEMICOLON : ‘;’;
T_OPER : ‘>’;
WS : (’ ‘|’\t’|’\r’|’\n’) { skip(); };[/code]
[]´s