有没有办法使用 CUP 和 Jflex 显示当前的解析操作?
Is there a way to display the current parsing action using CUP and Jflex?
对于我的编译器 class,我们必须使用 JFlex 和 CUP 创建一个词法分析器和一个语法分析器。部分作业还要求我们打印出给定输入文件的标记和相应的解析操作。此外,reduce 动作需要显示相应的生产编号。
例如,如果我的解析器的语法是
- S -> aXc
- X -> bX
- X -> b
- X -> Yd
- Y -> Yd
- Y -> d
然后输出一串 abbbc 作为输入
a [shift]
b [shift]
b [shift]
b [shift]
c [reduce 3] [reduce 2] [reduce 2] [shift]
[reduce 1]
[accept]
我知道 CUP 有调试选项,但输出需要采用这种特定格式。显示令牌很容易,因为我可以在 Flex 规范的规则部分打印出令牌,但我不知道如何打印出 CUP 规范中的操作。
我自己回答这个问题,以防其他人遇到同样的问题——我最终将我对 CUP
的调用从 parser()
更改为 parser_debug()
,它显示了有关的所有信息转移和减少,并让我的词法分析器打印出标记。输出在我能够重定向两个应用程序的输出的地方,并将其通过管道传输到我编写的 python 脚本中,该脚本将内容重新格式化为教授想要的方式。
对于我的编译器 class,我们必须使用 JFlex 和 CUP 创建一个词法分析器和一个语法分析器。部分作业还要求我们打印出给定输入文件的标记和相应的解析操作。此外,reduce 动作需要显示相应的生产编号。
例如,如果我的解析器的语法是
- S -> aXc
- X -> bX
- X -> b
- X -> Yd
- Y -> Yd
- Y -> d
然后输出一串 abbbc 作为输入
a [shift]
b [shift]
b [shift]
b [shift]
c [reduce 3] [reduce 2] [reduce 2] [shift]
[reduce 1]
[accept]
我知道 CUP 有调试选项,但输出需要采用这种特定格式。显示令牌很容易,因为我可以在 Flex 规范的规则部分打印出令牌,但我不知道如何打印出 CUP 规范中的操作。
我自己回答这个问题,以防其他人遇到同样的问题——我最终将我对 CUP
的调用从 parser()
更改为 parser_debug()
,它显示了有关的所有信息转移和减少,并让我的词法分析器打印出标记。输出在我能够重定向两个应用程序的输出的地方,并将其通过管道传输到我编写的 python 脚本中,该脚本将内容重新格式化为教授想要的方式。