对于 JavaCC 中的这段文本,我的解析器中缺少什么?

What am I missing in my parser for this text in JavaCC?

所以我正在学习如何在 JavaCC 中创建解析器。这将是我们希望解析的语言类型。

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 119
  1. 我们有一些解析器也需要遵循的规则。
  2. 除了“”内的空格外,我们必须忽略空格。
  3. 我们可以有任意数量的总线声明,其中的顺序将始终相同。
  4. 总线名称(用双引号引起来)可以包含任意数量的字符。
  5. 时间为 24hopur 格式hh::mm,每辆巴士申报必须有一个。
  6. 停靠站编号都是预定义的位置,每条公交车申报必须至少有 2 个。
  7. 每个总线声明中可能会出现也可能不会出现免费一词。

以下是我目前的实现,我会试着解释一下我的思考过程。

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" > 
    
    }

// 被用作临时评论指标。

所以我创建了可以跳过的角色。 还有我能想到的所有代币。

但我不确定我错过了什么。 任何帮助将不胜感激,或者解释会更好,因为我真的想学习如何做到这一点。

谢谢。

一些评论。对于

    < BUSNUMBER : "bus(["0"-"9"]) |

你的意思可能是

    < BUSNUMBER : "bus(" (["0"-"9"])+ ")" > |

但是,如果要允许空格,则应将 bus() 和数字视为单独的标记。

对于

    < BUSNAME : "(["a"-"z", "A"-"Z"])*  //Match a single character which can be lowercase or upper. Happens 0 or more times.

你可能想要

   < BUSNAME : "\"" (["a"-"z", "A"-"Z", " "])* "\""> | 

(我不知道总线名称中可能包含哪些字符,但在您的示例中,您既有字母也有空格。)

您缺少 ->、停止次数和次数。