如何将部分输入排除在解析之外

How to exclude parts of input from being parsed?

本文关键字:排除 输入      更新时间:2023-10-16

好了,我已经建立了一个完整的Bison语法(加上对应的Lex语法),这就是我需要的:

是否有任何方法可以设置语法规则,使输入的特定部分从解析中排除,而是按原样检索?

external_code : EXT_CODE_START '{' '}';
例如,我如何将花括号之间的部分作为字符串,而不允许解析器使用它(因为它将是"外部"代码,它将不遵守我当前的语言规则…所以,这是可以的-文本是好的)。

你会怎么做呢?

我应该通过向Lexer添加令牌来解决这个问题吗?(就像我处理字符串字面值一样,例如?)

欢迎任何想法!(我希望你明白我需要什么…)


注:嗯,我还想过处理整个情况,就像处理c风格的多行注释一样(=在注释开始时捕获,在Lexer中,然后-从自定义函数中,继续进行,直到找到注释结束)。这肯定是某种解决方案。但是,难道没有什么……容易吗?

您可以调用词法分析器的input/yyinput函数从输入流中读取字符并对它们进行处理(并且它们不会被标记化,因此解析器永远不会看到它们)。

您可以使用词法分析器状态,将词法分析器置于不同的状态,它将跳过被排除的文本,而不是将其作为标记返回。

上述任何一个解析器操作的问题都是处理解析器的一个标记前瞻性,这在某些(但不是全部)情况下会发生。例如,下面的代码可能可以工作:

external_code: EXT_CODE_START '{' { skip_external_code(); } '}'

作为操作将处于默认的还原状态,没有前瞻性。在这种情况下,skip_external_code可以只是设置词法分析器状态(上面的第二个选项),或者它可以调用input,直到它到达匹配的},然后调用unput一次(上面的第一个选项)。

请注意,skip_external_code函数需要在词法分析器文件的第3部分中定义,以便它可以访问词法分析器中的静态函数和宏(这两种技术都依赖于它们)。