gpt4 book ai didi

java - 如何忽略不重要的节点?

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

我正在使用 ANTLR 4.9.2 来解析表示汇编指令的语法。

grammar IrohAsm;
main: line* | EOF;

line: (rangedec | instruction | comment)? EOL;

instruction: MNEMONIC firstoperand COMMA secondoperand;
rangedec : range assignment?;
firstoperand : range | mem | REGISTER;
secondoperand : range | mem | IMM | REGISTER;
range : IDENTIFIER OPENBRACKETS IMM CLOSEDBRACKETS;
assignment : EQUALS OPENCURL IMM (COMMA IMM)* CLOSECURL;
mem : AT IMM;
comment : '#' ~EOL*;

WHITESPACE : (' ') -> skip ;

// remember to append \n to input
EOL : '\n';

OPENCURL : '{';
CLOSECURL : '}';
OPENBRACKETS : '[';
CLOSEDBRACKETS : ']';
COMMA : ',';
EQUALS : '=';
AT : '@';
MNEMONIC : ('jmp' | 'add' | 'sub' | 'jez' | 'mov' | 'wrt' | 'get');
REGISTER: ('ab' | 'bb' | 'cb' | 'db');
IMM : DIGITS RADIX?;
RADIX : ('d' | 'b' | 'h');
DIGITS : [0-9]+;
IDENTIFIER: ([a-zA-Z0-9] | '$' | '_' | '\u00C0'..'\uFFFF')+ ;
语法工作正常,但生成如下树;
Parse Tree Example
当给出以下输入时:
mov ab,ab

如您所见,COMMA 被包含为指令的子级之一。它的位置对语言很重要,但我在解析后并不真正关心它。有什么办法可以让我完全把它从最后一棵树上去掉吗?如果是这样,这会改变语法还是我解析树的代码?
Removing Extraneous Nodes
我当前获取树的代码:
CharStream inputStream = CharStreams.fromFileName("src/test/assembly/cool.asm");
IrohAsmLexer lexer = new IrohAsmLexer(inputStream);
IrohAsmParser parser = new IrohAsmParser(new CommonTokenStream(lexer));
ParseTree parseTree = parser.main();

最佳答案

您的问题归结为:“如何将我的解析树转换为抽象语法树?”。对此的简单回答是:“你不能”:)。至少,没有使用内置的 ANTLR 机制。您必须遍历解析树(使用 ANTLR 的访问者或监听器机制)并手动构建 AST。
从解析树更轻松地创建 AST 的功能通常会在 ANTLR 的 Github 存储库中弹出:

  • https://github.com/antlr/antlr4/issues/2428

  • 以及在stackoverflow上:
  • Generate AST using ANTLR4 generated visitor
  • ANTLR4 AST Creation - How to create an AstVistor
  • 关于java - 如何忽略不重要的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69732452/

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