1. 基本格式
{user declarations}
%%
{ML-Yacc declarations}
%%
{rules}
类似于ML-Lex,{user declarations}用户声明部分用于定义规则中用到的自定义值。建议尽量缩短这部分的代码。
{ML-Yacc declarations}部分用于进行必须和可选的声明。如,必须声明终结符、非终结符以及与他们相关联的值类型,必须定义语法分析器的名字,position值的类型,可以跟在开始符号后面的终结符和非终结符有哪些等。可以选择的声明有:终结符的优先级,禁止默认的规约,规定生成程序是否在.desc文件中生存冗长的描述信息等等。
{rules}部分包括上下文无关文法和相应的语义行为。
2. 必要的ML-Yacc声明
%name:语法分析器名字
%term:终结符 %nonterm:非终结符
这两个声明类似ML中的datatype的声明。不要用ML的关键字作为符号名字。
%term NAME1 [of ML-type]
| NAME2 [of ML-type]
%pos:声明表示位置值的类型
%pos <ML-type>
3.可选的声明
%arg:声明调用语法分析器的时候传入的参数
%eop:声明可以跟在起始符号后面的终结点,必须在term中声明过。
%noshift:声明不可转换的符号,即不可出现在规则的右部。
%header (functor {parser name}LrValsFun(structure Token : TOKEN ...) )
%left,%right,%nonassoc:优先级
%start:声明起始符
%verbose:描述文件的名
参考资料:http://www.smlnj.org/doc/ML-Yacc/mlyacc002.html