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

编译器/解释器

开发平台:

Others

  1. /* ANTLR Translator Generator
  2.  * Project led by Terence Parr at http://www.jGuru.com
  3.  * Software rights: http://www.antlr.org/RIGHTS.html
  4.  *
  5.  * $Id: //depot/code/org.antlr/release/antlr-2.7.0/antlr/tokdef.g#1 $
  6.  */
  7. header { package antlr; }
  8. /** Simple lexer/parser for reading token definition files
  9.   in support of the import/export vocab option for grammars.
  10.  */
  11. class ANTLRTokdefParser extends Parser;
  12. options {
  13. k=3;
  14. interactive=true;
  15. }
  16. file [ImportVocabTokenManager tm] : 
  17. name:ID
  18. (line[tm])*;
  19. line [ImportVocabTokenManager tm]
  20. { Token t=null; Token s=null; }
  21. : ( s1:STRING {s = s1;}
  22. | lab:ID {t = lab;} ASSIGN s2:STRING {s = s2;}
  23. | id:ID {t=id;} LPAREN para:STRING RPAREN
  24. | id2:ID {t=id2;}
  25. )
  26. ASSIGN 
  27. i:INT
  28. {
  29. Integer value = Integer.valueOf(i.getText());
  30. // if literal found, define as a string literal
  31. if ( s!=null ) {
  32. tm.define(s.getText(), value.intValue());
  33. // if label, then label the string and map label to token symbol also
  34. if ( t!=null ) {
  35. StringLiteralSymbol sl =
  36. (StringLiteralSymbol) tm.getTokenSymbol(s.getText());
  37. sl.setLabel(t.getText());
  38. tm.mapToTokenSymbol(t.getText(), sl);
  39. }
  40. }
  41. // define token (not a literal)
  42. else if ( t!=null ) {
  43. tm.define(t.getText(), value.intValue());
  44. if ( para!=null ) {
  45. TokenSymbol ts = tm.getTokenSymbol(t.getText());
  46. ts.setParaphrase(
  47. para.getText()
  48. );
  49. }
  50. }
  51. }
  52. ;
  53. class ANTLRTokdefLexer extends Lexer;
  54. options { 
  55. k=2;
  56. testLiterals=false;
  57. interactive=true;
  58. }
  59. WS : ( ' '
  60. | 't'
  61. | 'r' ('n')? {newline();}
  62. | 'n' {newline();}
  63. )
  64. { _ttype = Token.SKIP; }
  65. ;
  66. SL_COMMENT :
  67. "//"
  68. (~('n'|'r'))* ('n'|'r'('n')?)
  69. { _ttype = Token.SKIP; newline(); }
  70. ;
  71. ML_COMMENT :
  72.    "/*"
  73.    (
  74. 'n' { newline(); }
  75. | '*' ~'/'
  76. | ~'*'
  77. )*
  78. "*/"
  79. { _ttype = Token.SKIP; }
  80. ;
  81. LPAREN : '(' ;
  82. RPAREN : ')' ;
  83. ASSIGN : '=' ;
  84. STRING
  85. : '"' (ESC|~'"')* '"'
  86. ;
  87. protected
  88. ESC : '\'
  89. ( 'n'
  90. | 'r'
  91. | 't'
  92. | 'b'
  93. | 'f'
  94. | '"'
  95. | '''
  96. | '\'
  97. | ('0'..'3') ( DIGIT (DIGIT)? )?
  98. | ('4'..'7') (DIGIT)?
  99. | 'u' XDIGIT XDIGIT XDIGIT XDIGIT
  100. )
  101. ;
  102. protected
  103. DIGIT
  104. : '0'..'9'
  105. ;
  106. protected
  107. XDIGIT :
  108. '0' .. '9'
  109. | 'a' .. 'f'
  110. | 'A' .. 'F'
  111. ;
  112. protected
  113. VOCAB
  114. : '3'..'176' // common ASCII
  115. ;
  116. ID :
  117. ('a'..'z'|'A'..'Z') 
  118. ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
  119. ;
  120. INT : (DIGIT)+
  121. ;