使用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 类 将比将每个字符视为标记更容易处理。
我是 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 类 将比将每个字符视为标记更容易处理。