繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM