我正在尝试做一个简单的lex&yacc程序,它可以识别pikachu的三种声音: pi、pika和pikachu。我唯一的规则是,一个令牌不能在一行中出现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
;
%%但这并不适用于所有的组合,例如皮卡皮卡丘皮卡丘。我怎么能重写这个?也尝试过限制lex中的标记,比如{0,2},但是当我编写pi时,它仍然工作,即使它不应该。
最新消息。
根据下面的想法,我成功地完成了这个任务。我非常接近,我所需要的是保持跟踪,也有2次重复。我闻到了这样的味道:
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
;发布于 2020-05-24 19:09:13
您的语法在正确的轨道上,但需要稍加调整。
直观地说,每个非终端都会跟踪您看到的最后一个终端,这样就不允许同一字符串连续出现两次。你可以通过让非终端跟踪以下信息来扩展这个想法:我最后看到的终端是什么,我看到了多少副本?例如,当最后一个终端是PI时,就有两个非终端,一个用于PI读取是第一个PI,另一个用于PI读取是第二个PI。根据到目前为止所读到的,想想这些不同的非终端之间的产品将如何转换。
https://stackoverflow.com/questions/61990580
复制相似问题