使用antlr解析消息,如何解决歧义文字

using antlr parse message, how to resolve ambiguous literal

我是 ANTLR 的新手,尝试使用 ANTLR 解析 World Meteorological Organization (WMO) messages。一条消息是这样的:“AVB 12 CVD A12”。这是我的语法:

grammar a;

rule : aaa bbb? ccc ddd;
aaa: char char char ;
bbb: Digit Digit ;
ccc: ('+'|'-')? char 'V' char;
ddd: 'A' Digit Digit;
char : 'A'|'V'| Char;

Char: [A-Z];
Digit: [0-9];
WS: [ \t\n\r=] ->skip;

而且有效!但是词法分析器只标记了输入中的一个字符,我不知道另一种方法。谁能提出更好的方法?

将其中的大部分识别为令牌会稍微清理一下。

我不知道您要解析的内容的语义,所以我不知道什么是合适的名称。 (我将相应地为 Lexer 和 Parser 规则使用 L# 和 p#。

grammar a;

rule : L1 L2? L3 L4;

fragment CHAR: [A-Z];
fragment DIGIT: [0-9];

L3: ('+'|'-')? CHAR 'V' CHAR; // place before L1 for to take precedence for "*V*" chars 
L1: CHAR CHAR CHAR ;
L2: DIGIT DIGIT ;
L4: 'A' Digit Digit;

WS: [ \t\n\r=] ->skip;

一旦给标记赋予有意义的名称,语法(和生成的 *Context 类 将比将每个字符视为标记更容易处理。