Une grammaire pour cela ressemblerait à ceci:
parse
: line* EOF
;
line
: (comment | values) (NL | EOF)
;
comment
: ELEMENT+
;
values
: PIPE (ELEMENT PIPE)+
;
PIPE
: '|'
;
ELEMENT
: ('a'..'z')+
;
NL
: '\r'? '\n' | '\r'
;
WS
: (' '|'\t') {$channel=HIDDEN;}
;
Et pour le tester, il vous suffit de saupoudrer un peu de code dans votre grammaire comme ceci:
grammar Route;
@members {
List<List<String>> values = new ArrayList<List<String>>();
}
parse
: line* EOF
;
line
: (comment | v=values {values.add($v.line);}) (NL | EOF)
;
comment
: ELEMENT+
;
values returns [List<String> line]
@init {line = new ArrayList<String>();}
: PIPE (e=ELEMENT {line.add($e.text);} PIPE)*
;
PIPE
: '|'
;
ELEMENT
: ('a'..'z')+
;
NL
: '\r'? '\n' | '\r'
;
WS
: (' '|'\t') {$channel=HIDDEN;}
;
Générez maintenant un lexeur/analyseur en invoquant:
java -cp antlr-3.2.jar org.antlr.Tool Route.g
créer une classe RouteTest.java
:
import org.antlr.runtime.*;
import java.util.List;
public class RouteTest {
public static void main(String[] args) throws Exception {
String data =
"a comment\n"+
"| xxxxx | y | zzz |\n"+
"another comment\n"+
"| a | abc | b | def |";
ANTLRStringStream in = new ANTLRStringStream(data);
RouteLexer lexer = new RouteLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
RouteParser parser = new RouteParser(tokens);
parser.parse();
for(List<String> line : parser.values) {
System.out.println(line);
}
}
}
compiler tous les fichiers source:
javac -cp antlr-3.2.jar *.java
et exécutez la classe RouteTest
:
// Windows
java -cp .;antlr-3.2.jar RouteTest
// *nix/MacOS
java -cp .:antlr-3.2.jar RouteTest
Si tout va bien, vous voyez ce imprimé sur votre console :
[xxxxx, y, zzz]
[a, abc, b, def]
Editer: notez que je l'ai simplifié un peu en n'autorisant que des lettres minuscules, vous pouvez toujours élargir l'ensemble du cours.
Bienvenue sur SO! Petite astuce: Vous devez mettre en retrait le code de 4 espaces ce qui amènera ce site à analyser et à afficher le code, ce qui peut être fait en surlignant le bloc et en appuyant sur le bouton "Code" en haut ou en appuyant sur Ctrl + K. – RCIX
Merci, ceci est mon premier article sur Stack Overflow, et merci pour l'accueil chaleureux. – Ben