JFLEX AND CUP,无法使其正常工作 [英] JFLEX AND CUP, cannot make it work correctly

查看:56
本文介绍了JFLEX AND CUP,无法使其正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用jflex和cup,试图制作一个html解析器,但无法使其正常工作,

I'm working with jflex and cup, trying to make a html parser, but can't make it work correctly,

Netbeans,编译过程不会停止,始终会继续,无法在分析树中正确添加更多令牌",也不能在"TEXTO"中添加空间,这会破坏整棵树

Netbeans, the compile process dont stop, always continues, Can't add more "tokens" correctly in the parse tree, Also can't add space in "TEXTO" , this break the entire tree

lexicoh.jlex

lexicoh.jlex

      package compiladorhtml;
      import java_cup.runtime.*;

      %%

      %class Lexer 
      %line
      %column
      %cup

      %{   
          private Symbol symbol(int type) {
              return new Symbol(type, yyline, yycolumn);
          }
          private Symbol symbol(int type, Object value) {
              return new Symbol(type, yyline, yycolumn, value);
          }
      %}

      LineTerminator = \r|\n|\r\n
      WhiteSpace     = {LineTerminator} | [ \t\f]
      texto = [a-zA-Z0-9_]*

      %%

      <YYINITIAL> {
         "::"                { System.out.print("<"); return symbol(sym.INI);}
         "ENCA"              { System.out.print("HEAD>"); return symbol(sym.HEAD);}
         "/"                 { System.out.print("</");  return symbol(sym.FIN);}
         {texto}             { System.out.print(yytext()); return symbol(sym.TEXTO);}
         {WhiteSpace}        { /* just skip what was found, do nothing */ }   
         "&&"                  { System.out.print(""); return symbol(sym.FINAL); }   
      }
      [^]                    { throw new Error("Illegal character <"+yytext()+">"); }

sintaticoh.cup

sintaticoh.cup

                package compiladorhtml;
                import java_cup.runtime.*;

                parser code {:

                    public void report_error(String message, Object info) {

                        StringBuilder m = new StringBuilder("Error");

                        if (info instanceof java_cup.runtime.Symbol) {

                            java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);

                            if (s.left >= 0) {                

                                m.append(" in line "+(s.left+1));   

                                if (s.right >= 0)                    
                                    m.append(", column "+(s.right+1));
                            }
                        }

                        m.append(" : "+message);

                        System.err.println(m);
                    }

                    public void report_fatal_error(String message, Object info) {
                        report_error(message, info);
                        System.exit(1);
                    }
                :};



                terminal          INI, HEAD, TEXTO, FIN, FINAL;
                non terminal Object expr_list, expr_part;
                non terminal String expr;

                expr_list ::= expr_list expr_part | expr_part;

                expr_part ::= expr:e;

                expr ::=  INI HEAD 
                        | TEXTO 
                        | FIN HEAD
                        | FINAL;

java Main

java Main

                 public static void main(String[] args) throws IOException, Exception {

                        //CreateFiles();

                        //EJECUTAR PARA VER SI FUNCIONA, YA LO VI Y FUNCIONA
                        File fichero = new File("fichero.txt");
                        PrintWriter writer;
                        try {
                            writer = new PrintWriter(fichero);
                            writer.print("::ENCA NOMBRE ENCABEZADO /ENCA &&");
                            writer.close();
                        } catch (FileNotFoundException ex) {
                            System.out.println(ex);
                        }
                        Lexer thisscanner = new Lexer(new FileReader("fichero.txt"));
                        parser thisparser = new parser(thisscanner);
                        thisparser.parse();

                    }

                    public static void CreateFiles() {
                        String filelex = "path\\lexicoh.jlex";

                        File file = new File(filelex);
                        jflex.Main.generate(file);

                        String opciones[] = new String[5];
                        opciones[0] = "-destdir";
                        opciones[1] = "path";
                        opciones[2] = "-parser";
                        opciones[3] = "parser";
                        opciones[4] = "path\\sintacticoh.cup";
                        try {
                            java_cup.Main.main(opciones);
                        } catch (Exception ex) {
                            Logger.getLogger(CompiladorHTML.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    }

谢谢

推荐答案

我认为您应该这样做:

对于{texto},由于它是由文本和数字组成的字符串,因此您应按以下方式重新定义它:

for {texto}, since it is a string composed by text and number, you should redefine it in this way:

{texto} { System.out.println (yytext()); return new symbol(sym.TEXTO, new String (yytext())); }

然后,如果程序没有停止,则在读取源文件的过程中可能会出现一些问题.

Then, if the program doesn't stop, there could be some problems during the read of the source file.

这篇关于JFLEX AND CUP,无法使其正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆