2015-08-25 5 views
1

Когда я импортировать рецепт Lisra,Layout в Rascal

import demo::lang::Lisra::Syntax; 

Это создает синтаксис:

layout Whitespace  = [\t-\n\r\ ]*; 
lexical IntegerLiteral = [0-9]+ !>> [0-9]; 
lexical AtomExp  = (![0-9()\t-\n\r\ ])+ !>> ![0-9()\t-\n\r\ ]; 

start syntax LispExp 
     = IntegerLiteral 
     | AtomExp 
     | "(" LispExp* ")" 
     ; 

Через start syntax -Определение, макет должен быть проигнорирован вокруг входа, когда он обрабатывается, как указано в документации: http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html

Однако, когда я печатаю:

rascal>(LispExp)` (something)` 

Это дает мне ошибку concrete syntax fragment (или ParseError при использовании parse -функции), в отличие от:

rascal>(LispExp)`(something)` 

Который успешно разбирает. Я пробовал это как с одной из последних версий Rascal, так и с версией плагина Eclipse. Я здесь что-то не так?

спасибо.

Ps. Lisra в parse -функции:

public Lval parse(str txt) = build(parse(#LispExp, txt)); 

также терпит неудачу на примере:

rascal>parse(" (something)") 
|project://rascal/src/org/rascalmpl/library/ParseTree.rsc|(10329,833,<253,0>,<279,60>): ParseError(|unknown:///|(0,1,<1,0>,<1,1>)) 
    at *** somewhere ***(|project://rascal/src/org/rascalmpl/library/ParseTree.rsc|(10329,833,<253,0>,<279,60>)) 
    at parse(|project://rascal/src/org/rascalmpl/library/demo/lang/Lisra/Parse.rsc|(163,3,<7,44>,<7,47>)) 
    at $shell$(|stdin:///|(0,13,<1,0>,<1,13>)) 
+0

Мои извинения, я пропустил, что я должен использовать 'начать [LispExp]' ... Тем не менее, я считаю, что 'parse'-функция в рецепте Lisra имеет небольшую ошибку, тем не менее. –

ответ

1

При определении start нетерминальный Мошенник определяет два нетерминалы на одном дыхании:

rascal>start syntax A = "a"; 
ok 

Один не терминал - A, другой - start[A]. Учитывая расположение нетерминал в объеме, скажем L, последний автоматически определяется (что-то вроде) это правило:

syntax start[A] = L before A top L after; 

Если вы звоните парсер или хотите, чтобы разобрать конкретный фрагмент, вы можете использовать либо не терминальном:

parse(#start[A], " a ") // parse using the start non-terminal and extra layout 
parse(A, "a") // parse only an A 
(start[A]) ` a ` // concrete fragment for the start-non-terminal 
(A) `a` // concrete fragment for only an A 
[start[A]] " a " 
[A] "a" 

 Смежные вопросы

  • Нет связанных вопросов^_^