Así que estoy aprendiendo a crear un analizador en JavaCC. Este será el tipo de lenguaje que se espera que analicemos.
bus(59) -> "Beach Shuttle" at 9:30 10:30 11:30 12:00 13:00 14:00 15:00 via stops 3 76 44 89 161 32 free bus(1234) -> "The Hills Loop" at 7:15 7:30 7:45 8:05 8:20 8:40 9:00 via stops 99 97 77 66 145 168 bus(7) -> "City Transit" at 16:08 16:39 16:55 17:01 17:12 17:28 via stops 2 1 5 7 13 119A continuación se muestra mi implementación hasta ahora, trataré de explicar mi proceso de pensamiento.
PARSER_BEGIN(MyParser) import java.io.*; public class MyParser { public static void parse(String fileName) throws IOException, ParseException { MyParser parser = new MyParser(new FileInputStream(fileName)); parser.dsl(); } } PARSER_END(MyParser); //Remainder of the .jj file. //Tokens to ignore in the BNF follow. SKIP : { ' ' | '\t' | '\n' | '\r' } TOKEN : { < BUSNUMBER : "bus(["0"-"9"]) | < BUSNAME : "(["a"-"z", "A"-"Z"])* //Match a single character which can be lowercase or upper. Happens 0 or more times. < VIA : "via" > | < STOPS : "stops" > | < FREE : "free" > }// se utilizó como indicador de comentarios temporales.
Así que he creado mis personajes para saltar. Y todas las fichas que se me ocurran.
Pero no estoy seguro de lo que me estoy perdiendo. Cualquier ayuda sería apreciada, o una explicación sería mejor ya que realmente quiero aprender a hacer esto.
Gracias.
Algunos comentarios. Para
< BUSNUMBER : "bus(["0"-"9"]) |Quizá quieras decir
< BUSNUMBER : "bus(" (["0"-"9"])+ ")" > | Sin embargo, si desea permitir espacios, debe tratar bus , ( , ) y números como tokens separados.
Para
< BUSNAME : "(["a"-"z", "A"-"Z"])* //Match a single character which can be lowercase or upper. Happens 0 or more times.podrías querer
< BUSNAME : "\"" (["a"-"z", "A"-"Z", " "])* "\""> |(No sé qué caracteres son posibles en el nombre de un bus, pero en su ejemplo tiene espacios además de letras).
Te falta -> , parar números y horarios.