解析器的 步骤基本是:
1)预测子句的类型
2)调用函数来匹配子结构
3)匹配词法单元
4)按照需要插入代码
5)执行自定义的操作
match()函数的解释
将输入流里面的词法单元和传入他的参数进行比较,然后将输入的指针向前移动。
demo1
分析语句“if x<0 then return x=0;”
grammar文件
------------------------------------------------------------------------
grammar ifstat;
stat
:
returnstat
|
assign
|
ifstat
;
returnstat
:
'return' assign ';';
assign
:
'x' '=' expr;
ifstat
:
'if' expr 'then' stat;
expr
:
'x' '+' '0'
|
'x' '<' '0'
|
'0'
;
------------------------------------------------------------------------
demo2
分析[a,b,c]和[a,[b,c],d]
grammar文件
------------------------------------------------------------------------
list.g
grammar list;
list
: '[' elements ']';
elements
:
element (',' element)*;
element
:
Name | list;
//paraser
Name
:
('a'..'z'|'A'..'Z')+;
//lex
------------------------------------------------------------------------
重点在list的递归定义语法