- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Yacc/Bison 中创建一个 LALR(1) 解析器,它可以接受具有灵活语法的命令。一个例子是通过调整室温( float )、 window 位置(整数)和吊扇(枚举)来控制房屋中的环境。示例(所需的)语法是:
set kitchen 22.5, den 0 24.0, bathroom fast 25, kitchen slow
我被困在如何处理规则中所谓的“room_arg”的堆叠数据上。我可以添加 room_arg arg
输入%union
声明,设置%type <arg> room_arg
并制定“room_arg”规则:
room_arg: TOK_CIELING_FAN { $$.fan = $1; }
| TOK_WINDOW { $$.window_position = $1; }
| TOK_THERMOSTAT { $$.temperature = $1; }
但是当涉及到将“room_arg”规则减少为“room_args”时 - 我必须弄清楚哪些堆栈项目是哪些。除此之外,特定房间(示例中的“厨房”)的“room_cmd”不需要在命令中进行分组,这增加了我的挑战。
更改命令的格式固然很好,但可惜这是不可能的。
有人可以建议实现策略,或者改进解析器逻辑以使事情变得更简单吗?
要批评的语法如下。
%{
typedef enum fan_setting_tag { OFF, SLOW, MEDIUM, FAST } fan_setting;
struct room_arg_tag {
int window_position;
fan_setting fan;
float temperature;
char * room_name;
} room_arg;
%}
%token TOK_ROOM
%token TOK_CIELING_FAN
%token TOK_WINDOW
%token TOK_THERMOSTAT
%token TOK_SET
%type <fan> TOK_CIELING_FAN
%type <window> TOK_WINDOW
%type <tempr> TOK_THERMOSTAT
%type <str> TOK_ROOM
%union {
int window;
float tempr;
fan_setting fan;
}
%%
command: /* empty */ | cmd command
cmd: TOK_SET room_cmds { execute_command( ... ); }
room_cmds: room_cmd
| room_cmd ',' room_cmds
room_cmd: TOK_ROOM room_args
room_args: room_arg
| room_arg room_args
room_arg: TOK_CIELING_FAN
| TOK_WINDOW
| TOK_THERMOSTAT
最佳答案
在这种情况下,您确实需要继承属性。您可以使用额外的操作来模拟它们,但不幸的是 yacc 和 bison 没有为您提供更直接地执行它们的方法( btyacc 提供语法糖使这变得更容易。)
基本上,您所做的就是使用嵌入操作来设置继承的属性,并使用 $0
在较低级别的规则中访问它们。
使用 btyacc 你会这样做:
%union {
int window;
float tempr;
fan_setting fan;
room_arg *room;
}
%token<fan> TOK_CIELING_FAN
%token<window> TOK_WINDOW
%token<tempr> TOK_THERMOSTAT
%token<str> TOK_ROOM
%type<room> room_cmds(<room>)
%type<> room_cmd(<room>), room_args(<room>), room_arg(<room>)
%%
command: /* empty */ | cmd command ;
cmd: TOK_SET room_cmds(new_room_arg()) { execute_command( ... ); } ;
room_cmds($room):
room_cmd($room) { $$ = $room; }
| room_cmd($room) ',' room_cmds($room) { $$ = $room; }
;
room_cmd($room): TOK_ROOM room_args($room) { $room->room_name = $1; } ;
room_args($room):
room_arg($room)
| room_arg($room) room_args($room)
;
room_arg($room):
TOK_CIELING_FAN { $room->fan = $1; }
| TOK_WINDOW { $room->window_position = $1; }
| TOK_THERMOSTAT { $room->temperature = $1; }
;
在 yacc 或 bison 中,这会变成这样:
cmd: TOK_SET { $$ = new_room_arg(); } room_cmds { execute_command(...)' } '
room_cmds:
room_cmd { $$ = $<room>0; }
| room_cmd ',' { $$ = $<room>0; } room_cmds { $$ = $<room>0; }
;
room_cmd: TOK_ROOM { $$ = $<room>0; } room_args { $<room>0->room_name = $1; }
等等,这很难做到正确(在正确的位置获得所有正确的类型)并且容易出错。
在这种特定情况下,您可以只使用全局变量(因为不涉及递归),但在更复杂的情况下效果不太好。
关于c - 我如何应对/创建/规避 Yacc/Bison 中处理多个 %types 的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527026/
本文分享自华为云社区《【沃土方案--金融】银丰新融-反洗钱自主监测系统(一)》,作者:HuaweiCloudDeveloper 。 “三反(反洗钱、反恐怖融资、反逃税)”意见持续深化落实,第四轮互评估
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我们有一个数据驱动的 Activity ,它构建了一大组(通常最多 100 个)类似按钮的组件,并将它们放在一个 Scrollable 中。每个按钮都是从资源中膨胀的,并且基于 RelativeLay
我在一个非常早期的项目中使用 Hibernate EntityManager 和 Hibernate Annotations for ORM。该项目需要尽快启动,但规范不断变化,我担心系统将启动并收集
这是一个来自 SPOJ 的简单编程问题:http://www.spoj.com/problems/PROBTRES/ . 基本上,您需要输出 i 和 j 之间数字的最大 Collatz 循环。 (
由于 C++11 引入了新的统一初始化语法,许多人建议使用它来代替旧式语法。至少,如果不是这个所谓的极端情况: struct Foo { Foo(int){ std::cout
Log4J2漏洞涉及的影响太广了,昨天发文后很多粉丝留言问Spring Boot项目是否受到Log4J2漏洞影响。Spring官方已经全面进行了排查,现在大家可以知道这些信息和应对方法。 默认
我正在通过 UDP(视频数据)接收 RTP。 RTP 包含我需要解码的 H264。不幸的是,大多数 RTP 都包含零散的数据。由于缺少 RTP 序列,我无法正确重建 H264。 关于如何减少数据丢失以
我正在阅读 this thread并在解决方案中注意到,如果您发送的数据长度与实际数据分开,Nagle 的算法可能会播放和取消同步发送的数据。 我想知道这一点,因为我看到很多代码示例,客户端首先发送数
我正在创建一个简单的应用程序,它将使用react-native-firebase和react-native-maps。按照安装文档的说明,我已经启动并运行了 map ,没有任何问题。接下来,我已经安装
我是一名优秀的程序员,十分优秀!