Jflex/java 的问题,yyline 总是返回 1

问题描述

这是我第一次用 jflex 编写代码,我已经尝试了几天来修复它,但我不明白错误是什么。 jflex 总是返回 1 作为 yyline 的值,我的程序不能忽略例如结束行注释,或给出正确的错误行数。

我注意到 jflex 从未找到表达式“FIN_LINEA”,因为这是我用来标识行尾的表达式。我试图通过将 yyline ++ 放在该表达式中来强制计数器,但它从不计数。

这是我的代码

package generadores;

import java_cup.runtime.*;
import errores.Excepcion;
import java.util.ArrayList;

%%  
%class scanner
%public 
%line 
%char 
%cup 
%unicode   
%{
  private ArrayList<Excepcion> errores;

  public ArrayList<Excepcion> getErrores(){
    return errores;
    }
%}

%init{ 
    yyline = 1; 
    yychar = 1; 
    errores = new ArrayList<>();
%init}

/*Fundamental*/

DIGITO = [0-9] //Numbers
LETRA_MI = [a-z] //letters
LETRA_MA = [A-Z] //letters
LETRA = {LETRA_MI}|{LETRA_MA} //letters
ESPACIO_BLANCO = ((\r|\n|\r\n)|[ \t\f]) //White space <-----------------
ASCII = //[\"#$%&\'\(\)\*\+,-.\/:\;\<\=\>\?@\[\^_´\{\}\|] //ASCII symbols

/*Main*/
IDENTIFICADOR = ({LETRA_MI}|{LETRA_MA})({LETRA}|{DIGITO}|_)* //Id
CONJUNTO = "{"{IDENTIFICADOR}"}" //Special
SALTO = \\"n" //line break as text
COMILLA = \\"\'" //single quote as text 
COMILLA_dobLE = \\"\"" //double quote as text
SIGNO_ASIGNACION = "-" {ESPACIO_BLANCO}* ">"
SEParaCION = "%%" //Special
SIGNO_APERTURA = "{"  //Doc opening
SIGNO_CIERRE = "}" //Doc ending
SIGNO_COMB = [.|] //Signs
FIN_LINEA = \r\n|[\r\n\u2028\u2029\u000B\u000C\u0085]  //End line <-----------------
SIGNO_UNI = [+*?] //Signs
COMA = "," //Special
SIGNO_RANGO = "~" //Special


/*commentaries and text*/

COM_A = "<" //multi line comment opening
COM_C = ">" //multi line comment ending
COMM_LINEA = "/""/"({LETRA} | {DIGITO} | {ASCII}|{ESPACIO_BLANCO})* {FIN_LINEA} //Line comment
COMM_MULTI = {COM_A}"!" ({LETRA} | {DIGITO} | {ASCII} | {SALTO} |{ESPACIO_BLANCO})* "!"{COM_C} //Multi-line comment
TEXTO = //\"([^\"]|{COMILLA_dobLE})*\"  //Text
COMENTARIO = {COMM_MULTI}|{COMM_LINEA} //Comments group

/*Special notation*/
NOTACION_LETRA_MA = {LETRA_MA}{ESPACIO_BLANCO}* {SIGNO_RANGO}{ESPACIO_BLANCO}* {LETRA_MA}
NOTACION_LETRA_MI = ({LETRA_MI} {ESPACIO_BLANCO}*{SIGNO_RANGO}{ESPACIO_BLANCO}* {LETRA_MI})
NOTACION_ASCII_COMB = {ASCII}{ESPACIO_BLANCO}*{SIGNO_RANGO}{ESPACIO_BLANCO}*{ASCII}
NOTACION_NUMERO = {DIGITO} {ESPACIO_BLANCO}*{SIGNO_RANGO}{ESPACIO_BLANCO}* {DIGITO}
NOTACION_LETRA_COMB = {LETRA}{ESPACIO_BLANCO}*{COMA}{ESPACIO_BLANCO}*{LETRA}{ESPACIO_BLANCO}*({COMA}{ESPACIO_BLANCO}*{LETRA}{ESPACIO_BLANCO}*)*
NOTACION_NUMERO_COMB = {DIGITO}{ESPACIO_BLANCO}*{COMA}{ESPACIO_BLANCO}*{DIGITO}{ESPACIO_BLANCO}*({COMA}{ESPACIO_BLANCO}*{DIGITO}{ESPACIO_BLANCO}*)*
NOTACION = {NOTACION_LETRA_MA}|{NOTACION_LETRA_MI}|{NOTACION_LETRA_COMB}|{NOTACION_NUMERO}|{NOTACION_NUMERO_COMB}|{NOTACION_ASCII_COMB}

%%
<YYINITIAL> "CONJ"               {return new Symbol(sym.CONJ,yyline,yychar,yytext()); }   
<YYINITIAL> {

  ";"                            {return new Symbol(sym.PUNTOCOMA,yytext());}
  ":"                            {return new Symbol(sym.DOSPUNTOS,yytext());}
  {FIN_LINEA} {yychar=1;yyline++;}  // Never match
  {IDENTIFICADOR}                {return new Symbol(sym.IDENTIFICADOR,yytext());}
  {NOTACION}                     {return new Symbol(sym.NOTACION,yytext());} 
  {COMENTARIO}                   {} //jflex doesn't ignore
  {SIGNO_APERTURA}               {return new Symbol(sym.SIGNO_APERTURA,yytext());}
  {SIGNO_CIERRE}                 {return new Symbol(sym.SIGNO_CIERRE,yytext());}
  {SIGNO_ASIGNACION}             {return new Symbol(sym.SIGNO_ASIGNACION,yytext());}
  {SEParaCION}                   {return new Symbol(sym.SEParaCION,yytext());}
  {SIGNO_COMB}                   {return new Symbol(sym.SIGNO_COMB,yytext());} 
  {SIGNO_UNI}                    {return new Symbol(sym.SIGNO_UNI,yytext());} 
  {TEXTO}                        {return new Symbol(sym.TEXTO,yytext());}
  {CONJUNTO}                     {return new Symbol(sym.CONJUNTO,yytext());} 
  {SALTO}                        {return new Symbol(sym.SALTO,yytext());} 
  {COMILLA}                      {return new Symbol(sym.COMILLA,yytext());} 
  {COMILLA_dobLE}                {return new Symbol(sym.COMILLA_dobLE,yytext());}    
  {ESPACIO_BLANCO} {}
   .                             {errores.add(new Excepcion("Léxico","Caracter no válido detectado: " + yytext(),yychar));}  
}

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)