所以我正在学习如何在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" >
}
//用作临时注解指示符。
所以我创造了我的角色来跳过。还有我能想到的所有代币。
但我不确定我错过了什么。任何帮助都会被感激,或者一个解释会更好,因为我真的想学习如何做到这一点。
谢谢您。
1条答案
按热度按时间cyvaqqii1#
一些评论。对于
你也许是说
但是,如果要允许空格,则应
bus
,(
,)
,和数字作为单独的标记。对于
你可能想要
(我不知道总线名称中可能包含哪些字符,但在您的示例中,您有空格和字母。)
你失踪了
->
,停止数字和时间。