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

检查lexer中的上一个/左标记

邵弘义
2023-03-14

例如,如何在lexer
中找到上一个/左标记

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]*;
CARET  : '^';
RTN    : {someCond1}? CARET ID; // CARET not include this token
GLB    : {someCond2}? CARET ID; // CARET not include this token

共有2个答案

漆雕令秋
2023-03-14

我看了一下Lexer源代码。Lexer响应nextToken()调用(来自解析器)。我没有发现它跟踪以前的标记。并且无法直接访问CARET。给定此输入:

xyz ^abc

这个语法:

lexer grammar TLexer;

ID     : [a-zA-Z] [a-zA-Z0-9]* {System.out.println("ID ");} ;
CARET  : '^'                   {System.out.println("CARET ");} ;
WS     : [ \r\n] ;
RTN    : CARET ID {System.out.println("RTN " + _tokenStartCharIndex);} ;

输出为:

$ antlr4 TLexer.g4 
$ javac TLexer.java 
$ grun TLexer tokens -tokens -diagnostics -trace input.txt 
ID 
RTN 4
[@0,0:2='xyz',<1>,1:0]
[@1,3:3=' ',<3>,1:3]
[@2,4:7='^abc',<4>,1:4]
[@3,8:8='\n',<3>,1:8]
[@4,9:8='<EOF>',<-1>,2:9]

lexer为您提供一个类型为

鄢英毅
2023-03-14

谢谢,我是这样做的

lexer grammar TLexer;

@lexer::members {
    int lastTokenType = 0;
public void emit(Token token) {
    super.emit(token);
    lastTokenType = token.getType();
}
}

CARET  : '^';
RTN    : {someCond1&&(lastTokenType==CARET)}? ID;
GLB    : {someCond2&&(lastTokenType==CARET)}? ID;
ID     : [a-zA-Z] [a-zA-Z0-9]*;
 类似资料:
  • null 显然,我可以尝试在lexer语法中以以下方式解决这个问题: 但它也将包含结束标记,解析器语法更难看。 (加分题: 如何在中正确捕获空格,但可能需要使用lexer模式; 如何避免和其他lexer定义的干扰。)

  • 在HashMap中,我可以使用containsKey(i)或containsValue(i)来检查我是否被使用;对数组也可以这样做吗?我的意思是检查myarray i1中的值是否为z i1==myarray中每个数组的第一个元素的组 在我的例子中{1,3,0,2}

  • 问题内容: 我已经搜索过,但是找不到任何简单,直接的答案。如何检查ANALYZE当前使用的统计目标? 问题答案: 统计目标的设置存储在目录表中的每一列中。您可以这样设置: 并像这样检查它: 或者,您只需在pgAdmin的对象浏览器中查看创建脚本,如果该值与中的默认值不同,则会在该脚本中附加创建脚本。 我引用以下手册: attstattarget控制由累积的该列统计信息的详细程度。零值表示不应收集统

  • 问题内容: 我有两个arraylist 我想检查a2中是否存在a1的所有元素。这是我正在尝试的问题 这没有给出一致的结果…还有其他方法可以做到吗? 问题答案: 不知道我是否正确理解了您的问题,为什么使用? 试过这个: 它输出 添加一个额外的元素将使它失败(如预期): 它输出

  • 我需要检查一个arraylist中的任何值是否存在于另一个arraylist中: 它打印“它不包含”。我需要知道是否有方法比较这两个arraylist,如果其他arraylist中存在任何值,它应该返回。我知道迭代可以有所帮助。有什么简单的方法可以做到这一点吗?

  • 问题内容: 我有一组表,需要定期删除一些行并插入其他表来进行维护。其中一些表具有引用其他表的外键约束,因此这意味着表加载顺序很重要。要插入新行而不用担心表的顺序,我使用: 之前,然后: 后。 加载完成后,我想检查更新后的表中的数据是否仍具有参照完整性-新行不会破坏外键约束-但似乎没有办法做到这一点。 作为测试,我输入了肯定违反外键约束的数据,并且在重新启用外键检查后,mysql没有产生警告或错误。