Compiler construction 如何查找yacc规则的字符串?

Compiler construction 如何查找yacc规则的字符串?,compiler-construction,yacc,lex,Compiler Construction,Yacc,Lex,假设我有一个yacc规则,比如:Token:ID'('VALUES') 如何获取此规则的词素,即“foo(bar,baz)” 每个产品的规则,即值或ID,目前都在运行,我只是不知道如何打印当前词素。我不知道您认为“词素”是什么意思;你的用法令人困惑)是一个词素。显然,您列出的右侧产品与五个词素匹配。(如果VALUES真的是一个标记,那么可能是四个,但这将是一个非常奇怪的标记。)解析器中没有“当前词素”这样的东西。解析器符号(非终端和终端)具有语义值,这些值是在与产品关联的语义操作中设置的。@ri

假设我有一个yacc规则,比如:Token:ID'('VALUES')

如何获取此规则的词素,即“foo(bar,baz)”


每个产品的规则,即值或ID,目前都在运行,我只是不知道如何打印当前词素。

我不知道您认为“词素”是什么意思;你的用法令人困惑
是一个词素。显然,您列出的右侧产品与五个词素匹配。(如果
VALUES
真的是一个标记,那么可能是四个,但这将是一个非常奇怪的标记。)解析器中没有“当前词素”这样的东西。解析器符号(非终端和终端)具有语义值,这些值是在与产品关联的语义操作中设置的。@rici你说得对,我没有正确使用lexeme。我指的是标记的字符串,不是词素。本质上,在上面的示例中,我希望能够在语义操作中将“foo(bar,baz)”打印到stdout。为什么?我这样问是因为如果你想用它进行调试,可能有一个更简单的解决方案。总的来说,解析的重点是将输入文本分解成有意义的片段,并显示它们之间的关系。在这方面,仅仅将它们放回原始字符串并没有多大作用。@rici我正在尝试构造一个符号表,我计划对词素进行散列(例如,变量名“foo”将以其散列值存储在符号表中)。我正计划使用上面的printf示例进行调试。就我个人而言,我会在符号表中放入
foo
,然后再将其放入您的
Token
产品中。我甚至可能在词法扫描器中完成了这项工作,这取决于解析器的设计,尽管有些人认为扫描器应该与语义更加隔离。但这与调试无关:-)首先,调试解析器最简单的方法是使用Bison的跟踪功能,这在中的“调试您的解析器”部分中有描述。