ANTLR中文手册之三(ANTLR 元语言-元语言词汇表)

本文详细介绍了ANTLR的元语言词汇表,包括空格处理、注释、字符集、EOF标志、字符串常量、标记引用和定义、规则引用、语义动作及其参数。ANTLR支持C风格和C++风格的注释,以及Java风格的文档注释。在词法分析器中,字符串常量用于匹配输入流中的字符,而在语法分析器中,它们代表标记并分配特定的标记类型。ANTLR利用标记引用在词法分析器中调用规则进行匹配。文章还讨论了动作和动作参数的使用。
摘要由CSDN通过智能技术生成

元语言词汇表

空格定义 空格,tab符号和换行符号在ANTLR分隔诸如标识符这样的词汇符号时作为分隔符。在这之外,它们是被忽略的。例如,“FirstName LastName”对ANTLR来说两个标记符而不是一个标记符,空格,然后再接着一个标记符。

注释  

ANTLR 接受C语言风格的块注释和C++风格的行注释。在语法类和规则中,Java风格的文档注释也是可以接受的,在需要的时候,这些注释可以被传递给生成的输出文件。例如

/**This grammar recognizes simple expressions

 * @author Terence Parr

 */

class ExprParser;

 

/**Match a factor */

factor : ... ;

字符集

字符常数像Java中那样被确定。它们包含八进制转义字符集(e.g., '/377'),Unicode字符集(e.g., '/uFF00'),和能被Java识别的常用的字符转义('/b', '/r', '/t', '/n', '/f', '/'', '//')。在词法分析器规则中,单引号代表一个可以在输入字符流中能得到匹配的的字符。在语法分析器中是不被支持单引号的字符的。

 文件结束标志 EOF 标记用语法分析器规则中自动生成:

rule : (statement)+ EOF;

你可以在词法分析器规则的动作中检测EOF_CHAR符号:

// make sure nothing but newline or
// EOF is past the #endif
ENDIF
{
   
  boolean eol=false;
}
     :   "#endif"
         ( ('/n' | '/r') {eol=true;} )?
         {
    
           if (!eol) {
    
             if (LA(1)==EOF_CHAR) {error("EOF");}
             else {error("Invalid chars");}
           }
         }
     ;

当你将文件结束当一个字符来检测时,它实际上并不是一个字符,而是一个条件。

你可以在你的词法分析器语法中覆盖 CharScanner.uponEOF()函数:

/** This method is called by YourLexer.nextToken()
 *  when the lexer has
 * hit EOF condition. EOF is NOT a character.
 * This method is not called if EOF is reached
 * during syntactic predicate evaluation or during
 * evaluation of normal lexical rules, which
 * presumably would be an IOException. This
 * traps the "normal" EOF * condition.
 *
 * uponEOF() is called after the complete evaluation
 * of the previous token and only if your parser asks
 * for another token beyond that last non-EOF token.
 *
 * You might want to throw token or char stream
 * exceptions like: "Heh, premature eof" or a retry
 * stream exception ("I found the end of this file,
 * go back to referencing file").
 */
public void uponEOF()
  throws TokenStreamException, CharStreamException
{
   
}
 

文件结束条件是一个位比特(从2.7.1版本开始)。因为Terence 将-1当作一个字符而不是一个整型数。(-1 是 '/uFFFF'...晕!).

字符串

字符串常数一个由双引号括起来的一系列字符。在字符串中的字符可以是作为字符也同样合法的转义字符(八进制,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值