首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么能用雅克语识别皮卡丘语?

我怎么能用雅克语识别皮卡丘语?
EN

Stack Overflow用户
提问于 2020-05-24 18:34:16
回答 1查看 49关注 0票数 4

我正在尝试做一个简单的lex&yacc程序,它可以识别pikachu的三种声音: pi、pika和pikachu。我唯一的规则是,一个令牌不能在一行中出现3次。我试过这样做:

代码语言:javascript
复制
%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次重复。我闻到了这样的味道:

代码语言:javascript
复制
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
    ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-24 19:09:13

您的语法在正确的轨道上,但需要稍加调整。

直观地说,每个非终端都会跟踪您看到的最后一个终端,这样就不允许同一字符串连续出现两次。你可以通过让非终端跟踪以下信息来扩展这个想法:我最后看到的终端是什么,我看到了多少副本?例如,当最后一个终端是PI时,就有两个非终端,一个用于PI读取是第一个PI,另一个用于PI读取是第二个PI。根据到目前为止所读到的,想想这些不同的非终端之间的产品将如何转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61990580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档