Newtank

个人站

欢迎来到我的个人站~


词法分析(一)

目录

ANTLR

ANTLR是常用的词法分析器生成器,通过编写包含词法规则的g4文件,便可以自动生成一个词法分析器。

一个g4文件主要的词法分析相关的内容是词法规则和句法规则。其中句法规则以小写字母开头,词法规则以大写字母开头。

grammar SimpleExpr;

@header {
package simpleexpr;
}

//*: 0-n
prog : stat* EOF ;

//'if': literal
stat : expr SEMI
     | ID EQUAL expr SEMI
     | IF expr SEMI
     ;

EQUAL : '=' ;

SEMI : ';' ;

IF : 'if' ;

//|: or
//(): subrule
expr : expr (MUL|DIV) expr
     | expr (ADD|SUB) expr
     | ID
     | INT
     ;

SUB : '-' ;

ADD : '+' ;

DIV : '/' ;

MUL : '*' ;

ID : (LETTER|'_') (LETTER|DIGIT|'_')* ;

//+: 1-n
INT : '0'|([1-9][0-9]*) ;

WS : [ \t\r\n]+ -> skip ;

SL_COMMENT : '//' .*? '\n' ->skip;

ML_COMMENT : '/*' .*? '*/' ->skip;

fragment LETTER : [a-zA-Z] ;

fragment DIGIT : [0-9] ;

语言

字母表

字母表$\Sigma$上一个有限的符号集合

字母表$\Sigma$上的串($s$)是由$\Sigma$中符号构成的一个有穷序列。其中空串$\epsilon$的长度为0

串上的运算

连接运算:xy为x串和y串前后连接起来

指数运算:$s^0$为空串,$s^n$为n个s连接

语言

语言是给定字母表$\Sigma$上一个任意的可数的串集合

语言运算

  • L和M的并:$L\bigcup M={s\mid s\in L \or s\in M}$
  • L和M的连接:$LM={st\mid s\in L \and t\in M}$
  • L的Kleene闭包:$L^*=\bigcup^{\infin}_{i=0}L^i$
  • L的正闭包:$L^*=\bigcup^{\infin}_{i=1}L^i$

正则表达式

给定字母表$\Sigma$,$\Sigma$上的正则表达式由且仅由以下规则定义

  • $\epsilon$是正则表达式
  • $\forall a\in \Sigma$,$a$是正则表达式
  • 如果$r$是正则表达式,则$(r)$是正则表达式
  • 如果$r,s$是正则表达式,则$r\mid s,rs,r^*$为正则表达式

运算优先级:$() > * > 连接 > \mid$

每个正则表达式对应一个正则语言$L(r)$

  • $L(\epsilon)={\epsilon}$
  • $L(a)={a},\forall a \in \Sigma$
  • $L((r))=L(r)$
  • $L(r\mid s)=L(r)\bigcup L(s)$
  • $L(rs)=L(r)L(s)$
  • $L(r^)=(L(r))^$