Rascal 中的布局
Layout in 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
错误(或在使用 parse
函数时出现 ParseError
),与此相反:
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>))
当你定义一个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"
当我导入 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
错误(或在使用 parse
函数时出现 ParseError
),与此相反:
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>))
当你定义一个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"