gpt4 book ai didi

java - 如何允许词法分析器从 Java 解析特定的代码部分?

转载 作者:行者123 更新时间:2023-12-04 09:15:05 25 4
gpt4 key购买 nike

我目前正在使用 antlr4 创建一个编译器,它应该允许解析 java 代码。
我如何允许:

public void =(Integer value) => java { this.value = value; }
java { } 之间的代码没有被 antlr 解析,但在我的解析器中应该有一个访问者。
目前我有
javaStatementBody: KWJAVA LCURLY .*? RCURLY
但这显然不起作用,.*?解析整个文件。
请不要回答“使用引号”,那不是我的解决方案,因为我想允许 Java 代码突出显示。

最佳答案

您可以创建单独的词法分析器和解析器语法,以便您可以使用 lexical modes .每当词法分析器“看到”输入 java { ,它移动到 JAVA_MODE .在 Java 模式下,您可以标记注释、字符串和字 rune 字。同样在此模式下,您会遇到 { ,你推一样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));
这是以下解析树:
enter image description here

关于java - 如何允许词法分析器从 Java 解析特定的代码部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63260964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com