如何禁止令牌之间的空白?

时间:2019-02-14 17:14:39

标签: bison flex-lexer yacc lex lemon

在bash中,分配中=周围不能有空格。

x=10

bash的yylex()只是将整个x=10作为ASSIGNMENT_WORD令牌返回。然后进行处理。

http://git.savannah.gnu.org/cgit/bash.git/tree/parse.y#n723

但是更好地由解析器而不是词法分析器处理分配(作为我在解析器中处理分配的大多数示例)?

如何设计语法来禁用=周围的空格?谢谢。

1 个答案:

答案 0 :(得分:2)

  

但是更好地由解析器而不是词法分析器处理分配(作为我在解析器中处理分配的大多数示例)?

如果通常使用空格来分隔词法标记,那么避免为变量赋值产生异常可能更容易。请注意,在the shell command language的特定情况下,规范明确地描述了按照这种方式进行的词法标记化的解析,因此在这种情况下,编写代码以使其直接对应于规范特别有吸引力。

如果您这样做,那么也让词法分析器将分配识别为自己的标记类型,这将非常有帮助,因为该信息从词法分析中便宜出来,而对于解析器阶段则更为混乱且昂贵(重新)检查每个令牌值以识别哪些是分配。

  

如何设计语法来禁用=周围的空格?

如果将空白规则应用于语法级别(而不是令牌化级别),则令牌生成器需要发出显式的空白令牌,以便解析器可以看到空白的位置。然后,您可以编写语法规则,在允许的空白处而不是在不允许的空白处容纳空白。但是,请从做过此事(使用另一种语言)的人那里获取它:它丑陋且令人讨厌,您应该尽一切努力避免它。