好的,所以我设置了一个完整的Bison语法(+它的Lex对应物),这就是我需要的:
有没有什么办法可以设置一个语法规则,以便排除排除的特定部分被解析,而是按原样检索?
E.g。
external_code : EXT_CODE_START '{' '}';
例如,我怎么能将花括号之间的部分作为字符串,而不允许解析器使用它(因为它将是“外部”代码,它将不会遵守根据我目前的语言规则......所以,没关系 - 文字很好。)
你会怎么做?
我应该通过向Lexer添加令牌来解决此问题吗? (例如,与字符串文字相同?)
欢迎任何想法! (我希望你明白我的需要......)
PS 嗯,我也想到了处理整个情况,就像我对C风格的多行评论一样(=评论开始时的捕获,在Lexer中,然后 - 从一个自定义函数,继续运行直到找到注释结束)。这肯定是某种解决方案。但是没有什么......更容易吗?
答案 0 :(得分:2)
您可以调用词法分析器的input
/ yyinput
函数来读取输入流中的字符并对它们执行某些操作(并且它们不会被标记化,因此解析器将会从来没有见过他们。)
你可以使用词法分析器状态,将词法分析器置于一个不同的状态,它将跳过被排除的文本,而不是将其作为标记返回。
解析器操作中上述任何一个问题都是处理解析器的一个令牌前瞻,这种情况发生在一些(但不是全部)情况中。例如,以下内容可能会起作用:
external_code: EXT_CODE_START '{' { skip_external_code(); } '}'
因为操作将处于默认的还原状态,没有前瞻。在这种情况下,skip_external_code
可以只设置词法分析器状态(上面的第二个选项),也可以调用input
,直到它到达匹配的}
,然后调用unput
一次(上面的第一个选项)。
请注意,需要在词法分析器文件的第3部分中定义skip_external_code
函数,以便它可以访问词法分析器中的静态函数和宏(这两种技术都依赖于这些函数)。