0

sablecc を使用して有効なメッセージを解析しようとしました。有効なメッセージ形式には 3 つのタイプがあります。

  1. ああ; (英字3文字+セミ{messageid} messageid semi)
  2. んん; ( または 2 つの連続する英字または数字{flightnum} carriercode semi)
  3. -amm (またはハイフン + 英字 + 2 つの連続する英字または数字{load} hypene co semi)

プログラムに有効な文字列を入力しても機能しませんでした。

入力:

abc; // タイプ 1

グーグー; // タイプ 2

グーグー; // タイプ 2

-ab2; //type3

sablecc 文法コード :

 Helpers
    /* Our helpers */
    fa = ['0' .. '9'] ;
    a = [['a' .. 'z'] + ['A' .. 'Z']] ;
    m=  [a + fa];
    sp = ' ' ;
    cr = 13 ; // carriage return
    lf = 10 ; // line feed
    tab = 9 ; // tab char
    bl = sp | cr | lf | tab;


Tokens
    /* Our simple token definition(s). */
    semi = ';' bl*;
    co = (a)(m)(m);
    messageid = (a)(a)(a) ;
    carriercode = (m)(m);
    hypene ='-';

Productions
    program =  {single} statement |
                {sequence} program statement;
    statement = {messageid} messageid semi |
                {flightnum}carriercode semi |
                {load} hypene co semi ;

コンパイルが成功し、Java コードを実行すると、パーサー例外がスローされます。

simpleAdders.parser.ParserException: [1,1] 期待: messageid、carriercode、「-」

最初の文字列は有効ですが。

4

1 に答える 1

0

このエラーは、トークン定義の重複によって発生します。Sablecc は、シーケンス方式ではなく、ボトムアップのツリー構造で動作します。これは問題を解決するためのコードです。問題を解決してくれたエティエンヌに感謝します。

Helpers
    /* Our helpers */

    sp = ' ' ;
    cr = 13 ; // carriage return
    lf = 10 ; // line feed
    tab = 9 ; // tab char
    bl = sp | cr | lf | tab;


Tokens
    /* Our simple token definition(s). */

    fa = ['0' .. '9'] ;
    a = [['a' .. 'z'] + ['A' .. 'Z']] ;
    semi = ';' bl*;
    hypene ='-';

Productions
    program =  {single} statement |
                {sequence} program statement;
    m = {a} a | {fa} fa ;            
    co = hypene a [m1]:m [m2]:m semi;
    messageid = [a1]:a [a2]:a [a3]:a semi ;
    carriercode =[m1]:m [m2]:m semi;            
    statement = {messageid} messageid|
                {flightnum}carriercode |
                {load} co ;
于 2015-07-24T06:52:28.247 に答える