首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr4:如何将当前标记的值传递给词法分析器的谓词?

Antlr4:如何将当前标记的值传递给词法分析器的谓词?
EN

Stack Overflow用户
提问于 2019-07-10 01:51:58
回答 1查看 1.1K关注 0票数 1

有没有办法为词法分析器的谓词提供当前标记的值?例如,在我的lexer grammar FlowLexer中,我动态加载令牌:

在解析之前,我会动态加载令牌:

代码语言:javascript
复制
var lexer = new FlowLexer(new AntlrInputStream(flowContent)) {
    TokenExists = tokenValue => tokensDictionary.ContainsKey(tokenValue)
};

然后在解析/词法分析期间,TokenExists谓词被调用:

代码语言:javascript
复制
@lexer::members{
    public Func<string,bool> TokenExists = null;
}

/* ... stuff ... */

TOK : [-_.0-9a-zA-Z]+ 
    {!TokenExists(/*WHAT GOES HERE?*/);}? 
    -> mode(IN_TOKEN);

/* ... stuff ... */

但是如何将令牌值传递给TokenExists谓词呢?

(这是创建上下文感知词法分析器的尝试:我有几个mode,其中一个有不同的规则)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-10 15:14:20

使用特殊语法可以访问ANTLR4谓词和操作中的标记值。有关详细信息,请参阅Actions and Attributes文档。

通常,通过使用美元符号和令牌名称来访问解析后的令牌,例如

代码语言:javascript
复制
a: x = INT {$x.text == "0"}?;

或者不带标签(并且仅当子规则在该解析器规则中只存在一次时):

代码语言:javascript
复制
a: INT {$INT.text == "0"}?;

ANTLR4将这样的伪代码翻译成目标语言代码,以允许访问令牌属性(例如,在C++中变成:INT->getText() == "0")。

然而,在词法分析器规则中,这个special access ist not possible (ANTLR3支持它,但不支持ANTLR4)。尽管如此,您仍然可以使用本机代码访问令牌的属性(实际上,它不是直接的令牌,因为它还不存在,而是用于创建它的值,一旦lexer规则完成)。但是,这通常不能移植到其他目标语言(如果您没有多个解析器目标,这并不重要)。

在词法分析器操作(包括谓词)中触发的代码在词法分析器的上下文中执行。在规则结束后,此lexer保留将从中创建新令牌的值。这允许获取当前匹配的文本:

代码语言:javascript
复制
TOK : [-_.0-9a-zA-Z]+ {!TokenExists(Text);}? -> mode(IN_TOKEN);

TextC# lexer的属性。

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

https://stackoverflow.com/questions/56958161

复制
相关文章

相似问题

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