英文:
How to emit a token in ANTLR4?
问题
这是我的 grammar.g4
文件:
FOO: 'x';
BAR: 'y'
{ /* 在这里! */ };
我希望在输入中包含 y
时发射标记 BAR
和 FOO
。在 here!
部分应该写什么?请不要建议重新编写语法,这只是一个测试示例,我的真实情况要复杂得多。
英文:
This is my grammar.g4
:
FOO: 'x';
BAR: 'y'
{ /* here! */ };
I want tokens BAR
and FOO
to be emitted when the input contains y
. What should I write in the here!
part? Please, don't suggest to rewrite the grammar, this is just a test sample, my real case is much more complex.
答案1
得分: 2
这里是一个快速演示示例:
语法 T;
@lexer::members {
private java.util.LinkedList<Token> tokens = new java.util.LinkedList<>();
@Override
public Token nextToken() {
return tokens.isEmpty() ? super.nextToken() : tokens.poll();
}
}
parse
: foo bar foo EOF
;
foo : FOO;
bar : BAR;
FOO : 'x';
BAR : 'y' {this.tokens.offer(new CommonToken(TLexer.FOO, "x"));};
SPACES : [ \t\r\n] -> 跳过;
使用以下方式进行测试:
TLexer lexer = new TLexer(CharStreams.fromString("x y"));
TParser parser = new TParser(new CommonTokenStream(lexer));
System.out.println(parser.parse().toStringTree(parser));
这将打印出:
(parse (foo x) (bar y) (foo x) <EOF>)
英文:
Here's a quick demo:
grammar T;
@lexer::members {
private java.util.LinkedList<Token> tokens = new java.util.LinkedList<>();
@Override
public Token nextToken() {
return tokens.isEmpty() ? super.nextToken() : tokens.poll();
}
}
parse
: foo bar foo EOF
;
foo : FOO;
bar : BAR;
FOO : 'x';
BAR : 'y' {this.tokens.offer(new CommonToken(TLexer.FOO, "x"));};
SPACES : [ \t\r\n] -> skip;
Test with:
TLexer lexer = new TLexer(CharStreams.fromString("x y"));
TParser parser = new TParser(new CommonTokenStream(lexer));
System.out.println(parser.parse().toStringTree(parser));
which will print:
(parse (foo x) (bar y) (foo x) <EOF>)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论