Посвятите производство с Javacc
Я пытаюсь написать грамматику 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"
но не будет соответствовать"0key"
)<VALUE>
любая строка, заключенная в двойные кавычки и допускающая экранированные кавычки (например, совпадения"Hello"
,"Hi there"
,"escaped \" quote"
)
Пока что у меня что-то работает, но это не помогает, когда =
соответствует определению для <KEY>
маркер. Например, он разбирает "key_1" = "my value";
хорошо, потому что "my value"
не совпадает <KEY>
, но он не может разобрать "key_2" = "value";
так как "value"
Матчи <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> "="
следующий действительный токен виден только <VALUE>
? Ранее я использовал TatSu, у которого есть выражение "вырезать" специально для такого рода случаев, но я не могу найти никакого эквивалента в javacc.