作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试做一个简单的 lex&yacc 程序,它可以识别皮卡丘的三种声音:pi、pika 和 pikachu。我唯一的规则是一个 token 不能在一行中连续出现 3 次。我试过这个:
%token PI PIKA PIKACHU
%%
program : program line '\n'
|
;
line: PI piWords
| PIKA pikaWords
| PIKACHU pikachuWords
;
piWords: PI
| PI pikaWords
| PI pikachuWords
;
pikaWords: PIKA
| PIKA piWords
| PIKA pikachuWords
;
pikachuWords: PIKACHU
| PIKACHU piWords
| PIKACHU pikaWords
;
%%
program : program line '\n'
|
;
line: piWords
| pikaWords
| pikachuWords
;
piWords: PI
| PI pikaWords
| PI PI pikaWords
| PI pikachuWords
| PI PI pikachuWords
;
pikaWords: PIKA
| PIKA piWords
| PIKA PIKA piWords
| PIKA pikachuWords
| PIKA PIKA pikachuWords
;
pikachuWords: PIKACHU
| PIKACHU piWords
| PIKACHU PIKACHU piWords
| PIKACHU pikaWords
| PIKACHU PIKACHU pikaWords
;
最佳答案
你的语法在这里是正确的,但需要一点调整。
直观地说,您的每个非终结符都会跟踪您看到的最后一个终结符,因此您不允许同一字符串连续出现两次。您可以通过让非终端跟踪以下信息来扩展这个想法:我看到的最后一个终端是什么,我看到了多少副本?因此,例如,当最后一个终结符是 PI 时,您将有两个非终结符,一个用于读取 PI 是第一个 PI 时的非终结符,一个用于读取 PI 是第二个 PI 时的非终结符。根据目前所读到的内容,考虑产生式如何在这些不同的非终结符之间转换。
关于parsing - 我怎么能在yacc中识别皮卡丘语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61990580/
我是一名优秀的程序员,十分优秀!