Rascal中的布局

时间:2015-08-25 13:40:17

标签: rascal

当我导入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 - 定义,在解析输入时应忽略布局,如文档中所述:http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html

然而,当我输入:

rascal>(LispExp)` (something)`

这给我一个concrete syntax fragment错误(或使用ParseError - 函数时为parse),与之相反:

rascal>(LispExp)`(something)`

哪些成功解析。我尝试使用最新版本的Rascal以及Eclipse插件版本。我在这里做错了吗?

谢谢。

聚苯乙烯。 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>))

1 个答案:

答案 0 :(得分:1)

当你定义一个start非终端时,Rascal一次定义了两个非终端:

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"