对于 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
- 我们有一些解析器也需要遵循的规则。
- 除了“”内的空格外,我们必须忽略空格。
- 我们可以有任意数量的总线声明,其中的顺序将始终相同。
- 总线名称(用双引号引起来)可以包含任意数量的字符。
- 时间为 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" >
}
// 被用作临时评论指标。
所以我创建了可以跳过的角色。
还有我能想到的所有代币。
但我不确定我错过了什么。
任何帮助将不胜感激,或者解释会更好,因为我真的想学习如何做到这一点。
谢谢。
一些评论。对于
< 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", " "])* "\""> |
(我不知道总线名称中可能包含哪些字符,但在您的示例中,您既有字母也有空格。)
您缺少 ->
、停止次数和次数。
所以我正在学习如何在 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" >
}
// 被用作临时评论指标。
所以我创建了可以跳过的角色。 还有我能想到的所有代币。
但我不确定我错过了什么。 任何帮助将不胜感激,或者解释会更好,因为我真的想学习如何做到这一点。
谢谢。
一些评论。对于
< 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", " "])* "\""> |
(我不知道总线名称中可能包含哪些字符,但在您的示例中,您既有字母也有空格。)
您缺少 ->
、停止次数和次数。