2015-08-17 3 views
2

Если у меня есть:Бетонный Синтаксис 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, который проверяет, соответствует ли результат эквиваленту значению в среде в случае легко объявленной переменной.

Спасибо!

+0

Можете ли вы привести примеры других случаев, которые вы упоминаете? –

+0

Другой случай касался, например, '\' {Param ","} * paramDups {Param ","} paramDups \ '' в синтаксисе. Это предположительно либо приведет к исключению, либо приведет к ошибкам, как в примере выше (я нахожусь в процессе исправления моей развязанной версии Rascal, поэтому я не уверен на 100%). Однако мне интересно, почему переменное повторное использование не поддерживается для переменных в конкретных шаблонах, в то время как оно поддерживается для переменных в неконкретных шаблонах (например, numb (x), numb (x) '-example), как вы заявляете в своем ответе, что предполагается бросить исключение RedeclaredVariable. –

ответ

2

Это определенно ошибка: переменная e объявлена ​​дважды (без предупреждения), совпадение завершается, и печатается привязка ко второму e. Ожидаемое поведение заключается в том, что исключается исключение RedeclaredVariable.

работа вокруг выглядит следующим образом:

if ((Exp)`<IntegerLiteral e1> + <IntegerLiteral e2>` := (Exp)`5 + 6` && e1 == e2) { 
    println(e1); 
}