java—我在javacc中的文本解析器中缺少了什么?

svdrlsy4  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(252)

所以我正在学习如何在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

我们也有一些解析器需要遵循的规则。
我们必须忽略空格,除了“”中的空格。
我们可以有任意数量的总线声明,其中的顺序将始终相同。
总线名称(双引号中)将包含任意数量的字符。
时间是24hopur格式的hh::mm,每个总线声明必须有一个。
车站号都是预先定义的位置,每辆巴士至少有2个。
免费一词可能出现在每个巴士声明中,也可能不出现。
下面是我迄今为止的实现,我将尝试解释我的思想过程。

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

    }

//用作临时注解指示符。
所以我创造了我的角色来跳过。还有我能想到的所有代币。
但我不确定我错过了什么。任何帮助都会被感激,或者一个解释会更好,因为我真的想学习如何做到这一点。
谢谢您。

cyvaqqii

cyvaqqii1#

一些评论。对于

< 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", " "])* "\""> |

(我不知道总线名称中可能包含哪些字符,但在您的示例中,您有空格和字母。)
你失踪了 -> ,停止数字和时间。

相关问题