我的问题是关于如何处理Rascal语法定义中的保留关键字。以下面的Rascal模块为例,它来自于在线文档:
module Test
// Taken from http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html
start syntax Top = Identifier | ReservedKeyword;
layout MyLayout = [\t\n\ \r\f]*;
// Is OK, parse(#Top,"if") succeeds, parse(#Identifier,"if") fails
lexical Identifier = [a-z] !<< [a-z]+ !>> [a-z] \ MyKeywords;
// Goes wrong, parse(#Top,"if") fails, parse(#Identifier,"if") succeeds,
// so "if" is not exluded
//lexical Identifier = [a-z0-9] !<< [a-z][a-z0-9]* !>> [a-z0-9] \ MyKeywords;
keyword MyKeywords = "if" | "then" | "else" | "fi";
syntax ReservedKeyword = "if" | "then" | "else" | "fi";重点是,只有当词法定义为[a-z] !<< [a-z]+ !>> [a-z]时,保留关键字构造\ MyKeywords才有效。如果词法变得稍微复杂一些,则不再排除关键字[a-z0-9] !<< [a-z][a-z0-9]* !>> [a-z0-9]。
我在这里做错了什么?如何在标识符为[a-z][a-z0-9]*的情况下排除关键字
发布于 2016-03-24 19:37:56
问题的原因是,[a-z0-9]+旁边的符号(如[a-z] )的绑定强度不如\运算符和!>>运算符。
因此,这里我们仅从标识符的尾部[a-z0-9]+保留MyKeywords:
lexical Identifier = [a-z] !<< [a-z][a-z0-9]+ \ MyKeywords;要解决此问题,可以添加括号以从整个序列中删除MyKeywords:
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords;然后,您可以再次添加该限制:
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords !>> [a-z];或者像这样,等同地:
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) !>> [a-z] \ MyKeywords;https://stackoverflow.com/questions/36199047
复制相似问题