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

编译器/解释器

开发平台:

Others

  1. /* C++ interface test of Parser Exception Handling
  2.  *
  3.  * Given input:
  4.  *
  5.  * if a+ then a=b+b;
  6.  *
  7.  * the program should respond with
  8.  *
  9.  * invalid conditional in 'if' statement
  10.  * found assignment to a
  11.  */
  12. <<
  13. #include <stream.h>
  14. #include "DLGLexer.h"
  15. #include "PBlackBox.h"
  16. typedef ANTLRCommonToken ANTLRToken;
  17. int main()
  18. {
  19. ParserBlackBox<DLGLexer, PEHTest, ANTLRToken> p(stdin);
  20. int retsignal;
  21. p.parser()->rule(&retsignal);
  22. return 0;
  23. }
  24. >>
  25. /*
  26. Uncommenting this will make ANTLR think you put these handlers at the
  27. end of each rule:
  28. exception
  29. catch MismatchedToken : <<printf("dflt:MismatchedTokenn");>>
  30. default : <<printf("dflt:dfltn");>>
  31. */
  32. #token "[ t]+" <<skip();>>
  33. #token "n" <<skip(); newline();>>
  34. #token THEN "then"
  35. #tokclass DIE { "@" "if" ID "else" }
  36. class PEHTest {
  37. rule: ( stat )+
  38. ;
  39. stat: "if" t:expr THEN stat { "else" stat }
  40. | id:ID "=" expr ";"
  41. <<printf("found assignment to %sn", $id->getText());>>
  42. ;
  43.    exception[t]
  44. default :
  45. <<
  46. printf("invalid conditional in 'if' statementn");
  47. consumeUntilToken(THEN);
  48.             suppressSignal;
  49. >>
  50.    exception
  51. catch MismatchedToken :
  52. catch NoViableAlt :
  53. catch NoSemViableAlt :
  54. <<
  55. printf("stat:caught predefined signaln");
  56. consumeUntil(DIE_set);
  57.             suppressSignal;
  58. >>
  59. expr: expr1 ("+" expr1)*
  60. ;
  61. expr1
  62. : expr2 ("*" expr2)*
  63. ;
  64. expr2: ID
  65. ;
  66. }
  67. #token ID "[a-z]+"