Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决.flex文件的语法问题?_Java_Lexical Analysis_Jflex - Fatal编程技术网

Java 如何解决.flex文件的语法问题?

Java 如何解决.flex文件的语法问题?,java,lexical-analysis,jflex,Java,Lexical Analysis,Jflex,这是我第一次使用jflex,我在网上用我的母语(葡萄牙语)找到了一个教程,我安装并组装了所有东西 但是当我试图生成“Lexer”类时,它在我的“.flex”文件中显示了一个语法错误,我不知道可能会发生什么,因为看起来一切正常 .flex文件 //NOME_VARIAVEL,INT,DEC,COMENTARIO,BRANCO,PALAVRA_CHAVE,ERRO package Compilador; import static Compilador.Token.*; %% %{ priv

这是我第一次使用jflex,我在网上用我的母语(葡萄牙语)找到了一个教程,我安装并组装了所有东西

但是当我试图生成“Lexer”类时,它在我的“.flex”文件中显示了一个语法错误,我不知道可能会发生什么,因为看起来一切正常

.flex文件

//NOME_VARIAVEL,INT,DEC,COMENTARIO,BRANCO,PALAVRA_CHAVE,ERRO
package Compilador;
import static Compilador.Token.*;
%%
%{
    private void imprimir (String token,String lexema){
            System.out.println(lexema +" ===>> " + token);
    }
%}
%class Lexer
%type Token
nomeVariavel = [_a-zA-Z][_zA-z0-9]*
inteiro = [0-9]+
decimal = [0-9]+["."]+[0-9]+
blocoComentario = "/*" ~"*/"
branco = [\t|\n|\r]+
linhaComentario = [branco]*"//" .*
palavrasChave = "if" | "class" | "int" | "while" | "for" | "do" | "float"
%%

{palavrasChave}     { imprimir("PALAVRA_CHAVE : ", yytext()); return PALAVRA_CHAVE;  } 
{nomeVariavel}      { imprimir("VARIAVEL : ", yytext()); return NOME_VARIAVEL;  }
{inteiro}           { imprimir("NUMERO INTEIRO : ", yytext()); return INT;  }
{decimal}           { imprimir("NUMERO DECIMAL : ", yytext()); return DEC;  }
{blocoComentario}   { imprimir("COMENTARIO : ", yytext()); return COMENTARIO;    }
{linhaComentario}   { imprimir("COMENTARIO : ", yytext()); return COMENTARIO; }
{branco}            ( return BRANCO; } 
.   {imprimir("<<< CARACTER INVALIDO!!! >>>   ",yytext()); return ERROR;}
<<EOF>>     {return null;}
package compilador;

import java.io.*;

public class GeraLexer {
    public static void main(String[] args) throws IOException  {
     String arquivo ="<path redacted for reasons, but it is finding the file>";
     geraLexer(arquivo);
    }

    public static void geraLexer(String arq){
        File file = new File(arq);
        jflex.Main.generate(file);
    }
}
generator.flex文件

//NOME_VARIAVEL,INT,DEC,COMENTARIO,BRANCO,PALAVRA_CHAVE,ERRO
package Compilador;
import static Compilador.Token.*;
%%
%{
    private void imprimir (String token,String lexema){
            System.out.println(lexema +" ===>> " + token);
    }
%}
%class Lexer
%type Token
nomeVariavel = [_a-zA-Z][_zA-z0-9]*
inteiro = [0-9]+
decimal = [0-9]+["."]+[0-9]+
blocoComentario = "/*" ~"*/"
branco = [\t|\n|\r]+
linhaComentario = [branco]*"//" .*
palavrasChave = "if" | "class" | "int" | "while" | "for" | "do" | "float"
%%

{palavrasChave}     { imprimir("PALAVRA_CHAVE : ", yytext()); return PALAVRA_CHAVE;  } 
{nomeVariavel}      { imprimir("VARIAVEL : ", yytext()); return NOME_VARIAVEL;  }
{inteiro}           { imprimir("NUMERO INTEIRO : ", yytext()); return INT;  }
{decimal}           { imprimir("NUMERO DECIMAL : ", yytext()); return DEC;  }
{blocoComentario}   { imprimir("COMENTARIO : ", yytext()); return COMENTARIO;    }
{linhaComentario}   { imprimir("COMENTARIO : ", yytext()); return COMENTARIO; }
{branco}            ( return BRANCO; } 
.   {imprimir("<<< CARACTER INVALIDO!!! >>>   ",yytext()); return ERROR;}
<<EOF>>     {return null;}
package compilador;

import java.io.*;

public class GeraLexer {
    public static void main(String[] args) throws IOException  {
     String arquivo ="<path redacted for reasons, but it is finding the file>";
     geraLexer(arquivo);
    }

    public static void geraLexer(String arq){
        File file = new File(arq);
        jflex.Main.generate(file);
    }
}
包编译器;
导入java.io.*;
公共类GeraLexer{
公共静态void main(字符串[]args)引发IOException{
字符串arquivo=“”;
geraLexer(arquivo);
}
公共静态虚化器(字符串arq){
文件=新文件(arq);
jflex.Main.generate(文件);
}
}
生成时出现错误

Reading "<path redacted for reasons, but it is finding the file>"

Error in file "<path redacted for reasons, but it is finding the file>" (line 28): 
Syntax error.
.   {imprimir("<<< CARACTER INVALIDO!!! >>>   ",yytext()); return ERROR;}
 ^
Exception in thread "main" jflex.GeneratorException: Generation aborted
    at jflex.Main.generate(Main.java:139)
    at compilador.GeraLexer.geraLexer(GeraLexer.java:13)
    at compilador.GeraLexer.main(GeraLexer.java:8)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
正在读取“”
文件“”中出现错误(第28行):
语法错误。
.   {imprimir(“>”,yytext());返回错误;}
^
线程“main”jflex.GeneratorException中出现异常:生成中止
在jflex.Main.generate(Main.java:139)
位于compileador.GeraLexer.GeraLexer(GeraLexer.java:13)
位于compileador.GeraLexer.main(GeraLexer.java:8)
Java结果:1
施工成功(总速度:0秒)

感谢任何愿意帮忙的人,是的,我先在谷歌上搜索过。

在前一行中,你已经

{branco}            ( return BRANCO; } 
应该是
{


您很快就会发现编写自己的解析器时,在正确的位置发现错误并不总是容易的。错误通常是在一个令牌之后检测到的,有时该令牌位于下一行。

规则中还有许多其他错误。
[“]
中的引号和
[\t\n\r]中的条形图
被视为普通字符,因此它们成为字符类的一部分。而
[branco]
是一个字符类,它与这六个字符中的任何一个匹配;您希望宏扩展
{branco}
.Dang,我没有注意到,谢谢你,伙计,这是一个教程遗漏的好信息,我一直在搜索它显示的行中的错误,并掩盖了上一行,现在它被解决了,谢谢=D。