2015-08-25 98 views
1

當我導入Lisra配方,佈局流氓

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 -definition,佈局要圍繞輸入時,它被解析忽略,如文件中所述:http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html

但是,當我輸入:

rascal>(LispExp)` (something)` 

這給了我concrete syntax fragment錯誤(或ParseError當使用parse -function),相比之下:

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]'...但是,我認爲,在Lisra配方的'parse'功能有一個小bug不過。 –

回答

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"