[英]How to allow lexer to parse specific code parts from java?
我目前正在使用 antlr4 创建一个编译器,它应该允许解析 java 代码。
我如何允许:
public void =(Integer value) => java { this.value = value; }
java { } 之间的代码没有被 antlr 解析,但在我的解析器中应该有一个访问者。
目前我有
javaStatementBody: KWJAVA LCURLY .*? RCURLY
但这显然不起作用并且。*? 解析整个文件。
请不要用“使用引号”回答,那不是我的解决方案,因为我想允许 java 代码突出显示。
您可以创建单独的词法分析器和解析器文法,以便您可以使用词法模式。 每当词法分析器“看到”输入java {
时,它就会移动到JAVA_MODE
。 在 Java 模式下,您可以标记注释、字符串和字符文字。 同样,在这种模式下,您遇到{
,您推送相同的JAVA_MODE
以便词法分析器知道它嵌套了一次。 当你遇到}
时,你会从堆栈中弹出一个模式(导致返回到默认模式,或者保持在 Java 模式但深度减少一级)。
快速演示:
IslandLexer.g4
lexer grammar IslandLexer;
JAVA_START
: 'java' SPACES '{' -> pushMode(JAVA_MODE)
;
OTHER
: .
;
fragment SPACES : [ \t\r\n]+;
mode JAVA_MODE;
JAVA_CHAR : '\'' ( ~[\\'\r\n] | '\\' [tbnrf'\\] ) '\'';
JAVA_STRING : '"' ( ~[\\"\r\n] | '\\' [tbnrf"\\] )* '"';
JAVA_LINE_COMMENT : '//' ~[\r\n]*;
JAVA_BLOCK_COMMENT : '/*' .*? '*/';
JAVA_OPEN_BRACE : '{' -> pushMode(JAVA_MODE);
JAVA_CLOSE_BRACE : '}' -> popMode;
JAVA_OTHER : ~[{}];
IslandParser.g4
parser grammar IslandParser;
options { tokenVocab=IslandLexer; }
parse
: unit* EOF
;
unit
: base_language
| java_janguage
;
base_language
: OTHER+
;
java_janguage
: JAVA_START java_atom+
;
java_atom
: JAVA_CHAR
| JAVA_STRING
| JAVA_LINE_COMMENT
| JAVA_BLOCK_COMMENT
| JAVA_OPEN_BRACE
| JAVA_CLOSE_BRACE
| JAVA_OTHER
;
使用以下代码对其进行测试:
String source = "foo \n" +
"\n" +
"java { \n" +
" char foo() { \n" +
" /* a quote in a comment \\\" */ \n" +
" String s = \"java {...}\"; \n" +
" return '}'; \n" +
" }\n" +
"}\n" +
"\n" +
"bar";
IslandLexer lexer = new IslandLexer(CharStreams.fromString(source));
IslandParser parser = new IslandParser(new CommonTokenStream(lexer));
System.out.println(parser.parse().toStringTree(parser));
这是以下解析树:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.