test.g
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:1k
源码类别:

编译器/解释器

开发平台:

Others

  1. /* This is test.g which tests multiple scanners/parsers; DLG-based scanner;
  2.  * also, we test multiple lexical classes.
  3.  */
  4. <<
  5. #include "Lexer.h"
  6. typedef ANTLRCommonToken ANTLRToken;
  7. #include "PBlackBox.h"
  8. int main()
  9. {
  10. ParserBlackBox<Lexer, Include, ANTLRToken> p(stdin);
  11. p.parser()->input();
  12. return 0;
  13. }
  14. >>
  15. #token "[ tn]+" <<skip();>>
  16. #lexclass START
  17. class Include {
  18. <<
  19. /* this is automatically defined to be a member function of Include::
  20.  * since it is within the "class {...}" boundaries.
  21.  */
  22. private:
  23. char *stripquotes(ANTLRChar *s)
  24. {
  25. s[strlen(s)-1] = '';
  26. return &s[1];
  27. }
  28. >>
  29. input
  30. : ( cmd | include )* "@"
  31. ;
  32. cmd : "print"
  33. ( NUMBER <<printf("%sn", $1->getText());>>
  34. | STRING <<printf("%sn", $1->getText());>>
  35. )
  36. ;
  37. include
  38. : "#data" STRING
  39. <<{
  40. FILE *f;
  41. f = fopen(stripquotes($2->getText()), "r");
  42. if ( f==NULL ) {fprintf(stderr, "can't open %sn", $2->getText()+1);}
  43. else {
  44. ANTLRTokenPtr aToken = new ANTLRToken;
  45. DLGFileInput in(f);
  46. Lexer scan(&in);
  47. scan.setToken(mytoken(aToken));
  48. scan.mode(Lexer::DATA);
  49. ANTLRTokenBuffer pipe(&scan);
  50. Include parser(&pipe);
  51. parser.init();
  52. parser.data();
  53. }
  54. }>>
  55. ;
  56. #lexclass DATA
  57. #token "[ tn]+" <<skip();>>
  58. data: "0x[0-9]+" ":" "0x[0-9]+"
  59. <<printf("data %sn", $1->getText());>>
  60. ;
  61. }
  62. #lexclass START
  63. #token STRING "" [a-zA-Z0-9_., t]+ ""
  64. #token NUMBER "[0-9]+"