main.sa
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:1k
源码类别:

编译器/解释器

开发平台:

Others

  1. class M is
  2.    -- Define a selector that can handle nested include files.
  3.    -- These variables are public so the parser/lexer can see them.
  4.    shared selector : ANTLR_TOKEN_STREAM_SELECTOR{ANTLR_COMMON_TOKEN};
  5.    shared parser : P_PARSER{ANTLR_COMMON_TOKEN,ANTLR_COMMON_AST};
  6.    shared main_lexer : P_LEXER{ANTLR_COMMON_TOKEN};
  7.    create : SAME is
  8.       res ::= new;
  9.       res.selector := #ANTLR_TOKEN_STREAM_SELECTOR{ANTLR_COMMON_TOKEN};
  10.       return res;
  11.    end;
  12. end;
  13. class MAIN is
  14.    main ( args : ARRAY{STR} ) is
  15.       if ( args.size < 2 ) then
  16.  #OUT + "usage " + args[0] + " <filename>n";
  17.  return;
  18.       end;
  19.  
  20.       f : IFSTREAM := IFSTREAM::open_for_read( args[1] );
  21.       if ( void(f) ) then
  22.  #OUT + "file "" + args[1] + "" not foundn";
  23.  return;
  24.       end;
  25.       protect
  26.  m ::= #M;
  27.  
  28.  -- attach java lexer to the input stream,
  29.  M::main_lexer := #P_LEXER{ANTLR_COMMON_TOKEN}( f );
  30.  -- notify selector about starting lexer; name for convenience
  31.  M::selector.add_input_stream( M::main_lexer, "main");
  32.  M::selector.select("main"); -- start with main P lexer
  33.  -- Create parser attached to selector
  34.  M::parser := #P_PARSER{ANTLR_COMMON_TOKEN,ANTLR_COMMON_AST}( M::selector );
  35.  -- Parse the input language: P
  36.  M::parser.file_name( args[1] );
  37.  M::parser.startRule;
  38.  
  39.       when $ANTLR_RECOGNITION_EXCEPTION then
  40.  #ERR + "exception: " + exception.str + "n";  
  41.       end;
  42.       
  43.    end;
  44. end;