Keyword 处理保留关键字取决于词法定义
我的问题是如何处理流氓语法定义中的保留关键字。以以下Rascal模块为例,该模块源自在线文档:Keyword 处理保留关键字取决于词法定义,keyword,rascal,reserved,Keyword,Rascal,Reserved,我的问题是如何处理流氓语法定义中的保留关键字。以以下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]*; // I
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";
模块测试
//取自http://tutor.rascal-mpl.org/Rascal/Declarations/SyntaxDefinition/SyntaxDefinition.html
开始语法Top=Identifier | ReservedKeyword;
布局MyLayout=[\t\n\\r\f]*;
//如果没有问题,解析(#Top,“if”)成功,解析(#Identifier,“if”)失败
词法标识符=[a-z]!>[a-z]\MyKeywords;
//出错,解析(#Top,“if”)失败,解析(#Identifier,“if”)成功,
//因此,不排除“如果”
//词汇标识符=[a-z0-9]!>[a-z0-9]\MyKeywords;
关键字MyKeywords=“如果”|“那么”|“其他”|“fi”;
语法ReservedKeyword=“if”|“then”|“else”|“fi”;
关键是保留关键字结构\MyKeywords
仅在词法定义为[a-z]!>[a-z]
。如果词法变得稍微复杂一点[a-z0-9]!>[a-z0-9]
则不再排除关键字
我做错了什么?在标识符(如
[a-z][a-z0-9]*
)的情况下,如何排除关键字?问题的原因是在[a-z]
旁边放置[a-z0-9]+
等符号的绑定强度低于\
运算符和!>>代码>操作员
因此,我们仅从标识符的尾部[a-z0-9]+
保留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];
或者类似地,相当于:
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) !>> [a-z] \ MyKeywords;
lexical Identifier=[a-z]!>[a-z]\MyKeywords;
问题的原因是,在[a-z]
旁边放置[a-z0-9]+
等符号的绑定强度低于\
运算符和!>>代码>操作员
因此,我们仅从标识符的尾部[a-z0-9]+
保留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];
或者类似地,相当于:
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) !>> [a-z] \ MyKeywords;
lexical Identifier=[a-z]!>[a-z]\MyKeywords;