我正在制作这种语法,以便我可以识别街道,鳕鱼等,它只会出现错误,但我无法解决。
grammar LabeledExpr;
/** The start rule; begin parsing here. */
exp: Inicio parte1 parte2 parte4 NL exp
| Inicio parte6 parte2 parte7 NL exp
|fim;
fim: /*vazio*/;
parte1: Id_Env Str Rua;
parte2: Virg Num parte3|/*vazio*/;
parte3: Andar|/*vazio*/;
parte4:Cod_Postal Str parte5;
parte5: Str |/*vazio*/;
parte6: Cod_Postal Id_Env Rua;
parte7:Str Str parte5;
Space : (' '|'\t')+ { skip(); };
Inicio : '#ID#';
Id_Env: [1-9]Nu?Nu?Nu?|'0';
Rua : '\"'('Rua'|'Av.'|'Trav.')Letra'\"';
Str : '\"'Letra'\"';
Letra: [A-Za-z ]+;
XXXX : [1-9]YYY;
YYY : Nu Nu Nu;
Andar: Num | 'R/C' | 'cave';
Cod_Postal: XXXX('-'YYY)?;
Num: [1-9]Nu*;
Nu: [0-9];
Virg:',';
NL : [\r\n]+;
Ponto: . ;
错误是:
line 1:38 mismatched input '123' expecting Num
line 2:35 mismatched input '3' expecting Num
line 3:55 mismatched input '9876' expecting Num
line 4:39 mismatched input '2623' expecting Num
有人理解吗?
答案 0 :(得分:0)
Id_Env与Num之前的123匹配。 叔
答案 1 :(得分:0)
您应该制定一些词法规则解析器规则。就像Ter已经指出的那样,你有一些lexer规则可以匹配相同的输入。这被解决为“第一次胜利”,即最高胜利。
我还会使Lettra
成为一个片段,否则会匹配R / C'或'cave'之类的东西。
另请注意,Ponto
匹配任何单个字符。虽然我不熟练使用你的母语,但我觉得Ponto
只能匹配这一点,所以你必须写'.'
而不是.
。