Если у меня есть:Бетонный Синтаксис Matching в Rascal
import demo::lang::Exp::Concrete::WithLayout::Syntax;
if ((Exp)`<IntegerLiteral e> + <IntegerLiteral e>` := (Exp)`5 + 6`) {
println(e);
}
Печатается 6
. Является ли это возможной ошибкой или конструктивным решением, например. из-за соображений производительности? Разумеется, ничего не нужно печатать, так как e
не может быть сопоставлен как с 5
, так и с 6
. Это, однако, в отличие от согласования с АТД, где это является пойманных, т.е .:
data ExpNum = numb(int n) | add(ExpNum e1, ExpNum e2);
if (add(numb(x), numb(x)) := add(numb(5), numb(6))) { println(x); }
не будет печатать номер, в то время как он делает печать номер при использовании numb(5)
вместо numb(6)
.
Ps. Я выполнил пример как из источника Rascal, используя Eclipse Plug-in Development (используя разветвленную версию, объединенную с последней версией Rascal), так и на двух машинах с использованием официального плагина Eclipse. Плагин, однако, вернулся следующее на обеих машинах:
|stdin:///|(4,46,<1,4>,<1,50>): Java compilation failed due to with classpath [/home/wouter/eclipse//plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar]: package org.eclipse.imp.pdb.facts.type does not exist
Причина, почему я спрашиваю потому, что несколько аналогично, ConcreteListVariablePattern
автоматически выбрасывает RedeclaredVariable
-exception без проверки, если значение результата матча эквивалентна переменной в окружающей среде, в отличие от, например, QualifiedNamePattern
, который проверяет, соответствует ли результат эквиваленту значению в среде в случае легко объявленной переменной.
Спасибо!
Можете ли вы привести примеры других случаев, которые вы упоминаете? –
Другой случай касался, например, '\' {Param ","} * paramDups {Param ","} paramDups \ '' в синтаксисе. Это предположительно либо приведет к исключению, либо приведет к ошибкам, как в примере выше (я нахожусь в процессе исправления моей развязанной версии Rascal, поэтому я не уверен на 100%). Однако мне интересно, почему переменное повторное использование не поддерживается для переменных в конкретных шаблонах, в то время как оно поддерживается для переменных в неконкретных шаблонах (например, numb (x), numb (x) '-example), как вы заявляете в своем ответе, что предполагается бросить исключение RedeclaredVariable. –