1

私はこの基本的な JFlex lexer を持っています:

import java.util.*;
%%

%public
%class TuringLexer
%type Void

%init{
yybegin(YYINITIAL);
%init}

%state COMM, GETALPH, MT, PARSELOOP, PARSELEMS, PARSESYMB, PARSEMT
%{
  ArrayList<Character> alf = new ArrayList<Character>();   
  String crtMach;
  String crtLoop;
  String crtLoopContent;
  String crtLoopContentParam;
  String crtContent;
  String crtSymb;
%}

//Input = [^\r\n]
SEP = [:space:]*
//COMM =[;.*$] 
name = [A-Za-z_]*
tok=[A-Za-z0-9#$@\*]
AL = "alphabet :: "
cont = [^]]*
param =[^)]*
letter = [A-Za-z]
opn = [\[?]
symb = [^\}]+
%%
 <COMM> {
  "."  { /* ignore */  System.out.println("Got into comm state ");}
  "\n" {System.out.println("Got out of comm state ");yybegin(YYINITIAL);}
}
 <GETALPH> {
 {SEP} { /* ignore */ }
 {tok} { String str = yytext();
     System.out.println("Alphabet -- " + str);
     Character c = str.charAt(0);
     alf.add(c); }
 ";"  {yybegin(YYINITIAL);}

}
 <YYINITIAL> {
 "\n"   { /* ignore */ System.out.println("Got into YYINITIAL"); }
 ";"  { yybegin(COMM); }

[^]                    { throw new Error("Illegal character <"+yytext()+">"); }
}

わかりやすくするためにコードは削除されていますが、問題はまだ残っているため、ここで簡単に特定できます。

これは入力ファイルです -> ファイルはsimple.mtと呼ばれます

そして、これはメインクラスです:

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.FileReader;
public class MainClass  {
public static void main(String args[]) throws IOException {
    Reader reader = new BufferedReader(new FileReader ("simple.mt"));
    reader.read();
    TuringLexer tl = new TuringLexer(reader);
    tl.yylex();
}
}

プロジェクトをEclipse(またはターミナル)で実行すると、次のようになります。

Exception in thread "main" java.lang.Error: Illegal character <l>
    at TuringLexer.yylex(TuringLexer.java:576)
    at MainClass.main(MainClass.java:11)

エラーの意味とデバッグ方法がわかりません.jflexファイルに残っているのは小さなサンプルなので、エラーを理解するのはそれほど難しくありません.

4

2 に答える 2

2

そのため、処理方法がわからない文字が入力に表示されます。

すべての lex ファイルには final が必要です。「不正な文字」エラー メッセージ(スローされた例外ではない) を出力するか、パーサーが処理するためにパーサーに戻るだけのルール。yytext[0]

後者の戦略では、たとえば = や + などの特殊文字ごとにルールを記述する必要もありません。パーサーはそれらを 、 などとして使用する必要があります'='。その場合'+'、(a) 不正な文字は構文エラーになります。しかし、もっと重要なことは、(b) パーサーがトークンを単に捨てるのではなく、エラー回復を使用できるようになることです。

于 2013-01-11T23:17:28.193 に答える
0

文法がすべて表示されていないか、文法が不完全です。

Exception in thread "main" java.lang.Error: Illegal character <l>

loopこのメッセージは、キーワードを処理していないことを示しています。

于 2013-01-13T04:52:25.760 に答える