【问题标题】:Identifier terminal except certain keywords除某些关键字外的标识符终端
【发布时间】:2015-06-17 17:49:09
【问题描述】:

我正在使用 Irony 框架并且我有:

IdentifierTerminal variable = new IdentifierTerminal("variable");

用于识别入口终端的终端。

这个变量终端可以保存任何字符串,除了预定义的保留字符串列表。 此标识符不以引号或双引号开头。

我想要类似的东西:

IdentifierTerminal variable = any contiguos string EXCEPT "event", "delegate";

我怎样才能为这个终端强制执行这条规则?

【问题讨论】:

    标签: parsing compiler-construction token grammar


    【解决方案1】:

    您是否明确声明了关键字?如果没有,此页面:https://en.wikibooks.org/wiki/Irony_-_Language_Implementation_Kit/Grammar/Terminals#Keywords 将向您展示如何操作。似乎您不需要明确地说标识符不能是关键字,因为解析器能够解决这个问题。我找到了以下引用

    最后,在大多数情况下,Irony 扫描器不需要区分关键字和标识符。它只是将所有字母数字单词标记为标识符,将其留给解析器以将它们彼此区分开来。一些基于 LEX 的解决方案试图将过多的责任放在扫描仪上,使其不仅识别令牌本身,而且识别其在周围环境中的作用。反过来,这需要大量的前瞻,使扫描器代码相当复杂。在作者看来,识别令牌角色是解析器的职责,而不是扫描器的职责。扫描器应该在不使用任何上下文信息的情况下识别令牌。

    来源:http://www.codeproject.com/Articles/22650/Irony-NET-Compiler-Construction-Kit

    【讨论】:

    • new IdentifierTerminal("variable") => "variable" 只是这个终端的名称,而不是它的值。我正在为 C# 使用 Irony 解析框架。
    • 不完全:我希望我的可变终端捕获所有字符串,除了一些我想指定的保留字。在文档中是相反的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 2015-05-23
    • 2023-02-01
    • 1970-01-01
    • 2019-03-03
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多