如何解决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 举报,一经查实,本站将立刻删除。