我正在尝试编写javacc语法来解析包含如下表达式的文件:
"key_1" = "my value";
"key_2" = "value";
基本上我想匹配<KEY> "=" <VALUE> ";"
,其中:
<KEY>
匹配正则表达式\"[a-zA-Z][a-zA-Z0-9_\-\.]*\"
(例如,匹配"key1"
,"my_key1"
,"my-key1"
,"my.key1"
,但不匹配{{ 1}})"0key"
是用双引号引起来的任何字符串,并允许转义的引号(例如,匹配<VALUE>
,"Hello"
,"Hi there"
)到目前为止,我已经完成了一些工作,但是当"escaped \" quote"
的正确行程与=
令牌的定义匹配时,它会失败。例如,由于<KEY>
与"key_1" = "my value";
不匹配,它对"my value"
的解析很好,但是由于<KEY>
与"key_2" = "value";
的匹配,它无法解析"value"
。 / p>
具体地说,我尝试解析<KEY>
的错误是:
"key" = "value";
这是我在名为Exception in thread "main" ParseException: Encountered " <KEY> "\"value\" "" at line 1, column 12.
Was expecting:
<VALUE> ...
的文件中的javacc语法:
TestParser.jj
如何指定一旦看到options {
STATIC=false;
}
PARSER_BEGIN(TestParser)
public class TestParser {
public static void main(String[] args) throws Exception {
final TestParser parser = new TestParser(new java.io.FileReader(args[0]));
parser.program();
}
}
PARSER_END(TestParser)
SKIP : {
" "
| "\t"
| "\n"
| "\r"
}
TOKEN : {
< KEY: "\"" (["a"-"z"]|["A"-"Z"]) (["a"-"z"]|["A"-"Z"]|["0"-"9"]|"_"|"-"|".")+ "\"" >
| < VALUE: "\"" ("\\" ~[]| ~["\"","\\"])* "\"" >
}
void program() : {}
{
(assignment())* <EOF>
}
void assignment(): {}
{
<KEY> "=" <VALUE> ";"
}
,下一个有效令牌只能是<KEY> "="
?我曾经使用过TatSu,在此之前专门使用过"cut" expression,但在javacc中找不到任何等效项。