首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析常量和标识符

解析常量和标识符
EN

Stack Overflow用户
提问于 2015-05-31 06:05:50
回答 1查看 112关注 0票数 1

我想匹配一个常量,它基本上是一个全大写的字符串。

此外,我希望匹配一个标识符,它可以包含小写和大写字母的混合。

代码语言:javascript
运行
复制
Start 
  = Constant
  / Identifier

Identifier
  = h:[A-Za-z_] t:[a-zA-Z0-9_]* { return { type: 'IDENTIFIER', value: h + t.join('') } }

Constant
  = h:[A-Z] t:[A-Z_0-9]* { return { type: 'CONSTANT', value: h + t.join('') } }

问题是,当我尝试匹配Asd时,它会说:Line 1, column 2: Expected [A-Z_0-9] or end of input but "s" found.

它似乎符合常量规则,但即使失败也不会切换到标识符...

问题似乎是一个常量也是一个有效的标识符,但我找不出规则来打破歧义,我认为如果常量匹配失败,它应该尝试标识符规则……

EN

回答 1

Stack Overflow用户

发布于 2015-08-01 07:58:30

这里的问题发生是因为解析表达式语法与上下文无关语法不同。他们得到了第一次匹配,而不是回溯。在Identifier之前定义Constant规则。Asd匹配常量规则的开始字符,但是下一个字符不匹配,因此它抛出一个错误,因为它是确定性的。希望它很容易修复:

代码语言:javascript
运行
复制
Start 
  = Constant
  / Identifier

Identifier
  = h:[A-Za-z_] t:[a-zA-Z0-9_]* { return { type: 'IDENTIFIER', value: h + t.join('') } }

Constant
  = h:[A-Z] ![a-z] t:[A-Z_0-9]* { return { type: 'CONSTANT', value: h + t.join('') } }  

输出:

代码语言:javascript
运行
复制
{
   "type": "IDENTIFIER",
   "value": "Asd"
}

默认情况下,PEGs是确定性的,并且避免了您的规则所定义的歧义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30551831

复制
相关文章

相似问题

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