gpt4 book ai didi

java - ANTLR3 解析器无法正确处理嵌套数组,但仅在 Java 输出中

转载 作者:行者123 更新时间:2023-12-02 06:25:12 25 4
gpt4 key购买 nike

我正在使用 ANTLR3 语法来解析简单的脚本语言。我正在为 C 和 Java 生成词法分析器和解析器。现在在 C 目标上,一切正常,但在使用 Java 目标时,嵌套​​数组初始值设定项无法正确解析。

例如,如果我使用此输入:"{ 1, 2, { 3, 4 } }"
解析器返回以下内容:(.array 1 2 .array)
但我希望这样: (.array 1 2 (.array 3 4))

第二个数组节点没有任何子节点。正如我所说,为 C 生成的解析器工作得很好。有谁知道为什么会发生这种情况?

这可能是与问题最相关的语法部分。它可能不是最好的语法,但到目前为止它的工作做得很好:

expression:             while_expression;                      
while_expression: LITERAL_WHILE T_LPAREN expr_assignment T_RPAREN T_LBRACE params? T_RBRACE -> ^(Op_while[".while"] expr_assignment params?) |
expr_assignment;

expr_assignment: expr_conditional (T_ASSIGN^ expr_conditional)?;

expr_conditional: LITERAL_IF T_LPAREN condif=expr_logical_or T_RPAREN LITERAL_THEN? alti1=expr_logical_or (LITERAL_ELSE alti2=expr_logical_or)? -> ^(Op_if[".if"] $condif $alti1 $alti2) |
(
(condc=expr_logical_or -> expr_logical_or)
(T_QMARK altc1=expr_conditional T_COLON altc2=expr_conditional -> ^(T_QMARK $condc $altc1 $altc2))?
);

expr_logical_or: expr_logical_and (T_LOG_OR^ expr_logical_and)*;
expr_logical_and: expr_bitwise_or (T_LOG_AND^ expr_bitwise_or)*;
expr_bitwise_or: expr_bitwise_xor (T_BIT_OR^ expr_bitwise_xor)*;
expr_bitwise_xor: expr_bitwise_and (T_BIT_XOR^ expr_bitwise_and)*;
expr_bitwise_and: expr_equality (T_BIT_AND^ expr_equality)*;
expr_equality: expr_relational ((T_EQ^|T_NEQ^) expr_relational)*;
expr_relational: expr_shift ((T_LT^|T_LTE^|T_GT^| T_GTE^) expr_shift)*;
expr_shift: expr_additive ((T_SHL^|T_SHR^) expr_additive)*;
expr_additive: expr_multiplicative ((T_PLUS^|T_MINUS^) expr_multiplicative)*;
expr_multiplicative: expr_unary ((T_MULT^|T_DIV^|T_MOD^|T_POW^) expr_unary)*;
expr_unary: T_PLUS expr_primary -> ^(Op_prefix[".prefix"] T_PLUS expr_primary) |
T_MINUS expr_primary -> ^(Op_prefix[".prefix"] T_MINUS expr_primary) |
T_NOT expr_primary -> ^(Op_prefix[".prefix"] T_NOT expr_primary) |
T_NEG expr_primary -> ^(Op_prefix[".prefix"] T_NEG expr_primary) |
T_INC expr_primary -> ^(Op_prefix[".prefix"] T_INC expr_primary) |
T_DEC expr_primary -> ^(Op_prefix[".prefix"] T_DEC expr_primary) |
expr_primary;
expr_primary: (expr_object->expr_object)
(
T_LBRACKET args=params T_RBRACKET -> ^(Op_index[".index"] $expr_primary $args) |
T_DOT id=val_id T_LPAREN argsopt=params_opt T_RPAREN -> ^(Op_thiscall[".thiscall"] $id $expr_primary $argsopt) |
T_DOT id=val_id -> ^(Op_property[".property"] $id $expr_primary) |
T_INC -> ^(Op_postfix[".postfix"] T_INC $expr_primary) |
T_DEC -> ^(Op_postfix[".postfix"] T_DEC $expr_primary)
)*;

expr_object: value -> ^(value) |
array_initializer -> ^(array_initializer) |
(T_LPAREN expression T_RPAREN) -> ^(expression) |
method_call -> ^(method_call) |
LITERAL_BREAK -> ^(Op_break[".break"]);

method_call: val_id T_LPAREN params_opt T_RPAREN -> ^(Op_call[".call"] val_id params_opt);
array_initializer: T_LBRACE params_opt T_RBRACE -> ^(Op_array[".array"] params_opt);
params_opt: params?;

params: expression (T_COMMA! expression)*;

最佳答案

首先不要这样做:^(值)。应该是值(value)。这可能会解决它。一个节点就是一棵树,不用说它是一棵树。

关于java - ANTLR3 解析器无法正确处理嵌套数组,但仅在 Java 输出中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20605985/

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