当前位置: 首页 > 知识库问答 >
问题:

可以为lexer定义自定义参数?

和丰羽
2023-03-14

例如,我在语法中定义了几个lexer规则:

INT: 'int';
FLOAT: 'float';
...

DIGIT : [0-9];
NUMERIC : (DIGIT+ | DIGIT+ '.' DIGIT+ | '.' DIGIT+ | DIGIT+ '.');
...

我需要以某种方式标记关键字(“int”、“float”和其他),当我使用TokenStream获取令牌时,我可以通过一些自定义符号对其进行过滤。

有可能吗?

现在我只看到一种方法——将必要的词汇组合成某种规则。

使现代化

我尝试应用下面第一个答案的第一个选项,但遇到了下一个问题:我得到一个错误:“TOKENNAME不是可识别的令牌名称”

因为这是一个问题。我从这里应用建议:

使用

options { tokenVocab = MyLexer; }

而不是

import MyLexer;

并获取错误:“error(114):MyParser。g4:3:23:找不到令牌文件。\MyLexer公司。代币'

这里说,我是如何理解的,当ANTLR源文件(MyParser. g4、MyLemus. g4)放置在放置生成包的同一目录中时可能会发生这种情况。但是我将输出文件的属性设置为另一个目录。也许我得到了一些误解...

这里有一个小例子。

共有1个答案

焦博实
2023-03-14

根据您使用词法器的其他内容,您可以探索2种途径。

>

以那里的文档为例:

lexer grammar SetType;
tokens { STRING }
DOUBLE : '"' .*? '"'   -> type(STRING) ;
SINGLE : '\'' .*? '\'' -> type(STRING) ;
WS     : [ \r\t\n]+    -> skip ;

这将允许单个类型STRING的多个规则,这是您将在流中收到的令牌类型。

拥有令牌流后,可以使用该命令标记和过滤令牌。如果以后仍需要解析,这有保留原始lexer流的好处。

同样,从antlr文档中窃取示例:

BLOCK_COMMENT
    : '/*' .*? '*/' -> channel(HIDDEN)
    ;
LINE_COMMENT
    : '//' ~[\r\n]* -> channel(HIDDEN)
    ;
 类似资料:
  • 是否有可能为raku语法定义一个自定义lexer,即将字符串转换为int-id值流的lexer?我在玩弄语法结构。 规则看起来很直观,因为它们可能在递归下降解析器中转换为函数。然而,令牌和正则表达式我希望能够通过显式令牌ID和一个接口将它们映射到一个名称,这样我就可以编写自己的lexer了?

  • 问题内容: 我有一些需要经常打印的结构。现在,我正在围绕该结构使用经典的打印包装器: 此功能很方便,但实际上也很有限。如果不进行新包装,则无法添加或添加一些文本。我知道我可以使用 va_arg 系列添加或添加一些文本,但是我觉得我会重新实现。 我想知道是否有可能向printf编写自定义函数。我希望能够写这样的东西: 这可能吗 ?我怎样才能做到这一点 ? 注意:我在Ubuntu Linux 10.0

  • 一份简单的元素定义 Editor.UI.registerElement('foobar-label', { template: ` <div class="text">Foobar</div> `, style: ` .text { color: black; padding: 2px 5px; border-radius: 3px

  • 免登录地址可扩展自定义参数 使用场景 开发正在对接积分商城过程中,会有一些特殊场景,需要实现特定的功能,为此免登录地址中支持增加可扩展自定义参数,实现特定功能的实现。从而增强免登录地址的使用范围 主要参数 1.dcustom参数 2.transfer参数 3.signKeys参数 使用方法详见具体参数使用说明

  • 我有一个错误: 原因:java.lang.IllegalArgumentException:指定为非Null的参数为Null:方法kotlin.jvm.internal.intrinsics.CheckParameterIsNotNull,参数savedInstanceState 当我试图在Kotlin中膨胀一个自定义对话框时,我在对话框中的super.oncreate行上得到了上面写的错误。 对

  • 感谢SpanInjector和SpanExtractor,您可以自定义spans的创建和传播方式。 目前有两种在进程之间传递跟踪信息的内置方式: 通过Spring Integration 通过HTTP Span ids从Zipkin兼容(B3)头(Message或HTTP头)中提取,以启动或加入现有跟踪。跟踪信息被注入到任何出站请求中,所以下一跳可以提取它们。 与以前版本的Sleuth相比,重要的