簡體   English   中英

JFLEX AND CUP,無法使其正常工作

[英]JFLEX AND CUP, cannot make it work correctly

我正在使用jflex和cup,嘗試制作html解析器,但無法使其正常工作,

Netbeans,編譯過程不會停止,始終會繼續,無法在解析樹中正確添加更多“令牌”,也無法在“ TEXTO”中添加空間,這會破壞整個樹

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

                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

                 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},由於它是由文本和數字組成的字符串,因此您應按以下方式重新定義它:

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

然后,如果程序沒有停止,則在讀取源文件的過程中可能會出現一些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM