名称
yacc -根据指定的语法规则产生 LR 分析程序的程序。
用法
yacc [-vltds] [-b prefix] [-N number] [-p symbol_prefix] [-P pathname]
grammar
标准
本文中的接口遵循下列工业标准:
yacc: XPG4, XPG4-UNIX
选项
-b prefix
定义所有输出文件名的前缀(prefix.tab.c, prefix.tab.h, 和 prefix.output)。
-d
产生 y.tab.h 文件,它包含yacc赋予的标记值的预定义。这可以使其它的源文件
通过包含该头文件来访问代码。
-l
在 y.tab.c 文件中不包含#line语句。仅在语法和相关动作被彻底调试后使用。
-N number
[Compaq] 提供给yacc额外的存储以创建它的先行LR(1)文法分析程序分析表(LALR),
这在编译非常大的语法时很重要。使用此选项时 number 值应大于40000。
-p symbol_prefix
允许多个yacc分析程序连接在一起。使用symbol_prefix前缀来代替 yy 表示全局符号。
-P pathname
指定可选的分析程序(替代/usr/ccs/lib/yaccpar)。
-s
[Compaq] 将yyparse()函数分解为几个小的函数,因为它的尺寸有些与语法成比例,这可能导致
yyparse()函数太大而不能被编译、优化或有效地执行。
-t
编译运行时调试代码。缺省情况下,当y.tab.c 被编译时不包含该代码。如果YYDEBUG具有非零值,
C编译器将会包含调试代码,而不管 –t 选项是否使用。不包含调试代码时,函数yyparse()将执行
的更快。
-v
生成y.output文件,它包含有关分析表的可读的描述以及由语法含糊导致的冲突的报导。
操作数
grammar
包含输入指令的文件。
描述
yacc的语法可以是不明确的;指定的优先规则用于打破这种不明确性。
你必须用C语言编译器编译输出文件y.tab.c 以产生yyparse() 函数。该函数必须与yylex
词法分析函数一起被调用,同样的还有main() 和 yyerror(),后者为错误处理函数(你必须
提供这些函数。当创建yacc可用的词法分析器时命令lex很有用。
yacc程序从文件/usr/ccs/lib/yaccpar中读取分析框架。使用环境变量 YACCPAR 可以指定其它
的分析框架。如果使用该环境变量,-P 选项将被忽略。
输入文件的语法
此段将对yacc输入文件(一般具有 .y 后缀)进行描述,同时提供一系列yacc所认识的
特殊值,宏和函数。
yacc输入文件的一般格式:
[ definitions ]
%%
[ rules ]
[ %%
[ user functions ]]
其中
definitions
此区域定义在以后的语法(如规则区域)中使用的变量,以及包含文件和处理条件。
此区域是可选的。
rules
定义语法分析的规则。此项必选。
user functions
定义可被规则区域使用的用户自定义函数。此项为可选项。
空字符(NULL)不能被用于语法规则,也不能在字面上使用。定义区域中的每一行可为:
%{
%}
所包含的 C 代码将输出为输出文件中的全局定义。此域通常包含预处理指令及外部
变量和函数的声明。
%token [type] token [number] [name [number]...
列出输入文件其它部分使用的标记和结束符号。对那些没在其它 % 中定义的标记此行
是必须的。如果type已经存在,此行定义的所有标记的 C 类型被声明为由type参考
的类型。如果标记后跟一个实际的整数值,该值将赋给标记。
%left [<type>] token [ number][name[number]]...