首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保留关键字的处理取决于词法定义

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

Stack Overflow用户
提问于 2016-03-24 19:26:14
回答 1查看 137关注 0票数 1

我的问题是关于如何处理Rascal语法定义中的保留关键字。以下面的Rascal模块为例,它来自于在线文档:

代码语言:javascript
复制
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]*的情况下排除关键字

EN

回答 1

Stack Overflow用户

发布于 2016-03-24 19:37:56

问题的原因是,[a-z0-9]+旁边的符号(如[a-z] )的绑定强度不如\运算符和!>>运算符。

因此,这里我们仅从标识符的尾部[a-z0-9]+保留MyKeywords

代码语言:javascript
复制
lexical Identifier = [a-z] !<< [a-z][a-z0-9]+ \ MyKeywords;

要解决此问题,可以添加括号以从整个序列中删除MyKeywords

代码语言:javascript
复制
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords;

然后,您可以再次添加该限制:

代码语言:javascript
复制
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) \ MyKeywords !>> [a-z];

或者像这样,等同地:

代码语言:javascript
复制
lexical Identifier = [a-z] !<< ([a-z][a-z0-9]+) !>> [a-z] \ MyKeywords;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36199047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档