Rascal: синтаксический анализ строки с несколькими "_" - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь разобрать строку, содержащую несколько «_», но получаю исключение CallFailed.

Я попытался создать небольшой пример синтаксиса проблемы.

layout Layout = WhitespaceAndComment* !>> [\ \t\n\r#];
lexical WhitespaceAndComment = [\ \t\n\r] | @category="Comment" "#" ![\n]* $;

syntax SourceList = sourceList: "$"? "{"? Id sourceFile "}"?;
lexical Id = ([a-zA-Z/.\-][a-zA-Z0-9_/.]* !>> [a-zA-Z0-9_/.]) \ Reserved;
keyword Reserved = 
"$" | "{" | "}" ; 

Я не могу разобрать этот небольшой пример.

rascal>try { parse(#SourceList, "test"); } catch CallFailed(m, e): println("<m> : <e>");
|prompt:///|(25,9,<1,25>,<1,34>) : [type(sort("SourceList"),(sort("SourceList"):choice(sort("SourceList"),{prod(label("sourceList",sort("SourceList")),[opt(lit("$")),layouts("$default$"),opt(lit("{")),layouts("$default$"),label("sourceFile",lex("Id")),layouts("$default$"),opt(lit("}"))],{})}),layouts("$default$"):choice(layouts("$default$"),{prod(layouts("$default$"),[],{})}),empty():choice(empty(),{prod(empty(),[],{})}),lex("Id"):choice(lex("Id"),{prod(lex("Id"),[conditional(seq([\char-class([range(45,47),range(65,90),range(97,122)]),conditional(\iter-star(\char-class([range(46,57),range(65,90),range(95,95),range(97,122)])),{\not-follow(\char-class([range(46,57),range(65,90),range(95,95),range(97,122)]))})]),{delete(keywords("Reserved"))})],{})}),keywords("Reserved"):choice(keywords("Reserved"),{prod(keywords("Reserved"),[lit("$")],{}),prod(keywords("Reserved"),[lit("}")],{}),prod(keywords("Reserved"),[lit("{")],{})}))),"${test}"]
ok

Измененный исходный файл с "test" на "$ {test}" дает точно такой же вывод.

Полный синтаксисв котором встроен SourceList, есть еще много правил.Но затем я получаю следующие результаты:

set(${TARGET_NAME}_DEPS
    GenConfiguration_OBJ_TN_Common # accept
    ${COMMON_BB_PCMDEPS}  # reject
    COMMON_BB_PCMDEPS # accept
    COMMON_BB_PCM_DEPS # reject
)

, для которых я хочу найти решение.

Что не так с минимальным примером?Почему тест или $ {тест} не принимаются?

Кстати: я использую последнюю нестабильную версию.Имеет ли смысл установить и попробовать стабильную версию?

1 Ответ

0 голосов
/ 15 июня 2019

Я пытался воспроизвести вашу проблему, но, похоже, она работает здесь:

rascal>parse(#SourceList, "test")
SourceList: (SourceList) `test`

Нестабильная версия на данный момент в порядке. На самом деле самое время выпустить стабильную версию. Так что сейчас вам лучше с нестабильной версией.

Исключение CallFailed сбивает с толку. Это означает, что вызывается функция, которую нельзя сопоставить ИЛИ не найти. Так что, возможно, parse не находится в области видимости, не импортируя ParseTree, или у вас есть другая функция с именем parse, которая не имеет type[Tree] и str в качестве ожидаемых параметров в области действия. Пока импортируется модуль ParseTree, ваш вызов на parse будет в порядке.

Пожалуйста, дайте мне знать, если вы добились прогресса. Возможно, перезапуск Eclipse может что-то прояснить.

...