Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Keyword 处理保留关键字取决于词法定义_Keyword_Rascal_Reserved - Fatal编程技术网

Keyword 处理保留关键字取决于词法定义

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

我的问题是如何处理流氓语法定义中的保留关键字。以以下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";
模块测试
//取自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;