如何将部分输入排除在解析之外
How to exclude parts of input from being parsed?
好了,我已经建立了一个完整的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部分中定义,以便它可以访问词法分析器中的静态函数和宏(这两种技术都依赖于它们)。
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 读取文件并输入到矢量中
- C++如何通过用户输入删除列表元素
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 用户定义函数中的指针和输入
- 如何在C++中检查2D数组中负值的输入验证
- 如何只允许用户输入正整数
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 可视C++ - 从链接器>输入>其他依赖项中排除文件
- 读取输入时如何排除空格
- 如何将部分输入排除在解析之外