繁体   English   中英

在 Rascal 中解析评论

[英]Parsing comment in Rascal

我有一个关于解析包含评论的片段的非常基本的问题。 首先我们导入我最喜欢的语言 Pico:

import lang::pico::\syntax::Main;

然后我们执行以下操作:

 parse(#Id,"a");

正如预期的那样:

 Id: (Id) `a`

然而,

parse(#Id,"a\n%% some comment\n");

给出解析错误。

我在这里做错了什么?

有多个问题。

  1. Id是一个词法,意味着布局(评论)永远不会存在
  2. 布局只插入在生产中的元素之间,而Id词法只有一个字符类,所以没有地方插入布局。
  3. 即使 Id 是具有多个元素的非终结符语法,它也会解析它们之间的注释而不是之前或之后。

有关syntaxlexicallayout之间差异的更多信息,请参阅: Rascal 语法定义

如果你想解析非终端周围的注释,我们为非终端修改了start 通常,布局只在生产中的元素之间插入,在 start 之前和之后也插入。

以这个语法为例:

layout L = [\t\ ]* !>> [\t\ ];
lexical AB = "A" "B"+;
syntax CD = "C" "D"+;
start syntax EF = "E" "F"+;

这将转换为以下语法:

AB   = "A" "B"+;
CD'  = "C" L "D"+;
EF'  = L "E" L "F"+ L;
"B"+ = "B"+ "B" | "B";
"D"+ = "D"+ L "D" | "D";
"F"+ = "F"+ L "F" | "F";

所以,特别是如果你想解析一个带有布局的字符串,你可以这样写:

lexical Id = [a-z]+;
start syntax P = Id i;
layout L = [\ \n\t]*;

parse(#start[P], "\naap\n").top // parses and returns the P node
parse(#start[P], "\naap\n").top.i // parses and returns the Id node
parse(P, "\naap"); // parse error at 0 because start wrapper is not around P

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM