您的方向是正确的,但是学习一些正确的术语很有用。了解术语将帮助您理解和使用包含更多有用信息的教科书。
在规则TYPE 中,名称ID 将被称为终端 符号,而TYPE 将被称为非终端 符号语法。 语法 是用于描述语言的一组规则。每个语法规则都定义了一个 非终结符 符号。最终,每个非终结符都将被描述为终结符符号以唯一(非模棱两可)的排列方式排列。
终端 符号由token 表示,它代表它的具体表示。具体表示是在键盘上实际键入的内容。构成具体表示的字符序列称为词位。 词素的匹配以创建tokens是词法分析器(或扫描器)执行的任务。标记序列与语法规则中的非终结符的匹配称为解析。
Flex 是生成词法分析器的工具,而 bison 是生成解析器的工具。
所以,TYPE 不是一个记号,而是一个非终结符(或者称为语法规则名称)。它不是由 flex 或 bison “产生”的,而是由语法的作者“产生”的。 bison 生成的解析器会将终端和非终端的序列减少到称为@的非终端 987654327@.
为了避免 tokens、terminals、non-terminals 和 rules 之间的混淆,有一个不成文的约定: tokens 或 terminal 符号用大写字母或字符常量书写。例如:
ID, '<'
非终结符或语法规则都写成小写以避免与前者混淆。例如:
type, expression
所以,有经验的野牛用户可能会这样写:
type_signature : ID
| ID '<' type_signature '>'
;
这样每个名字的性质就更清楚了。
现在讨论空格。不,flex 和 bison 不会(自动或以其他方式)忽略空格、制表符、换行符、回车和其他不可见字符,但它很复杂(就像你的问题一样)。
在词法分析器处理的具体表示中出现空白字符,在描述工具 flex 和 bison 的语言处理的规则集中出现空白字符。您希望处理的语言可能包含语法(甚至语义)重要的空白字符(一个极端的例子是称为WhiteSpace 的语言)。可以使用 flex 和 bison 为该语言编写解析器,因此它不能忽略其输入描述文件或输入语言中的所有空格!与其在这里讨论太多细节,但值得注意的是,在某些地方空白被忽略了,而在其他地方则特别重要;在一个更有经验的人之前,你应该小心。词法分析器规则文件中的空格比解析器规则文件更敏感。