处理语法中终端节点过多



我正在尝试使用https://github.com/antlr/grammars-v4/blob/master/protobuf3/Protobuf3.g4中的语法为protobuf3编写解析器。

,我试图处理我的语法中的_type声明:

field
: ( REPEATED )? type_ fieldName EQ fieldNumber ( LB fieldOptions RB )? SEMI
;
type_
: DOUBLE
| FLOAT
| INT32
| INT64
| UINT32
| UINT64
| SINT32
| SINT64
| FIXED32
| FIXED64
| SFIXED32
| SFIXED64
| BOOL
| STRING
| BYTES
| messageDefinition
| enumType
;

enterField中,我有这样的代码片段:

@Override
public void enterField(Protobuf3Parser.FieldContext ctx) {
MessageDefinition messageDefinition = this.messageStack.peek();
Field field = new Field();
field.setName(ctx.fieldName().ident().getText());
field.setPosition(ctx.fieldNumber().getAltNumber());
messageDefinition.addField(field);
super.enterField(ctx);
}

然而,我不确定如何在这里处理type_上下文。它有太多的终端节点(对于基本类型),它可以有一个messageType或一个enumType。

用例所有我关心的是如果是一个基本类型(类型名称,在这种情况下)或者如果它是一个复杂类型(如另一个消息或枚举)定义名称。

有没有一种方法可以做到这一点,而不必检查ctx.field_()的每个可能的结果?

谢谢

如果messageDefinitionenumType都返回单个词法分析器令牌,则可以通过使用标签使整个访问变得非常容易:

type_
: value = DOUBLE
| value = FLOAT
| value = INT32
| value = INT64
| value = UINT32
| value = UINT64
| value = SINT32
| value = SINT64
| value = FIXED32
| value = FIXED64
| value = SFIXED32
| value = SFIXED64
| value = BOOL
| value = STRING
| value = BYTES
| value = messageDefinition
| value = enumType
;

你只需要使用value:

字段
@Override
public void enterField(Protobuf3Parser.FieldContext ctx) {
...
const type = ctx.type_().value.getText();
...
super.enterField(ctx);
}

相关内容

  • 没有找到相关文章

最新更新