2014-05-23 20 views
0

我的工作與JFLEX和杯子,試圖使一個HTML解析器, 但不能讓它正常工作,JFLEX和杯賽,不能讓它正常工作

的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的主要

    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); 
         } 

        } 

感謝 enter image description here

回答

1

我認爲你應該這樣做:爲{texto}

,因爲它是一個由文字和數字組成的字符串,你應該這樣重新定義它:

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

然後,如果程序沒有停止,在讀取源文件時可能會出現一些問題。