[英]Parsing comment in Rascal
我有一个关于解析包含评论的片段的非常基本的问题。 首先我们导入我最喜欢的语言 Pico:
import lang::pico::\syntax::Main;
然后我们执行以下操作:
parse(#Id,"a");
正如预期的那样:
Id: (Id) `a`
然而,
parse(#Id,"a\n%% some comment\n");
给出解析错误。
我在这里做错了什么?
有多个问题。
Id
是一个词法,意味着布局(评论)永远不会存在Id
词法只有一个字符类,所以没有地方插入布局。 有关syntax
、 lexical
和layout
之间差异的更多信息,请参阅: 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.