- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为了使我的问题易于理解,我想使用以下示例:
以下代码在fortran语言中称为非阻塞do-loop
DO 20 I=1, N ! line 1
DO 20 J=1, N ! line 2
! more codes
20 CONTINUE ! line 4
20
表示内部do-loop和外部do-loop的结尾。
20
时,它将两次返回
ENDDO
终端。
yylex()
来获得一个终端。如果我可以要求野牛在某些情况下从
yylex()
获取端子,而在其他情况下可以从另一函数获取端子,也许我可以解决此问题,但是,那时我不知道。
最佳答案
修改(f)lex产生的词法扫描器以实现令牌队列很容易,但这不一定是最佳解决方案。 (请参阅下文,以获得更好的解决方案。)(此外,对于我的问题,我真的不清楚,在词法分析器中构造额外的标记是否确实合适。)
通用方法是将代码插入yylex
函数的顶部,您可以通过将代码紧接在%%
行之后和第一个规则之前来执行此操作。 (必须对代码进行缩进,以便不能将其解释为规则。)对于非可重入扫描程序,通常将涉及使用本地static
变量来保存队列。对于一个简单但愚蠢的示例,使用C API但使用C ++进行编译,以便可以访问C ++标准库:
%%
/* This code will be executed each time `yylex` is called, before
* any generated code. It may include declarations, even if compiled
* with C89.
*/
static std::deque<int> tokenq;
if (!tokenq.empty()) {
int token = tokenq.front();
tokenq.pop_front();
return token;
}
[[:digit:]]+ { /* match a number and return that many HELLO tokens */
int n = atoi(yytext);
for (int i = 0; i < n; ++i)
tokenq.push_back(HELLO);
}
std::queue<std::pair<int, YYSTYPE>>
的令牌队列来实现此目的,但是
YYSTYPE
通常是
union
的事实会带来一些麻烦。同样,如果那是使用令牌队列的唯一原因,那么很明显,可以用一个简单的计数器代替它,这样会更有效。例如,参见
this answer,其含义与您的问题相似(并注意该答案的注释1中的建议)。
return
的唯一词法分析器操作是
<<EOF>>
规则,并且只有在使用
END
令牌调用解析器以指示解析完成后才这样做。
yypstate
结构中,该结构需要在每次调用时传递给解析器。由于每个输入文件仅对词法分析器调用一次,因此,词法分析器拥有该结构是合理的,可以使用局部静态变量按上述方法完成此操作[注1]:调用
yylex
时初始化解析器状态,并且
EOF
规则删除解析器状态以回收其正在使用的任何内存。
yylval
变量[注2]。相反,必须提供指向语义值的指针作为
yypush_parse
的附加参数。如果您的解析器没有引用特定令牌类型的语义值,则可以为此参数提供NULL。或者,如下面的代码所示,您可以在词法分析器中使用局部语义值变量。不必每次对推送解析器的调用都提供相同的指针。总之,对扫描仪定义的更改很小:
%%
/* Initialize a parser state object */
yypstate* pstate = yypstate_new();
/* A semantic value which can be sent to the parser on each call */
YYSTYPE yylval;
/* Some example scanner actions */
"keyword" { /* Simple keyword which just sends a value-less token */
yypush_parse(pstate, TK_KEYWORD, NULL); /* See Note 3 */
}
[[:digit:]]+ { /* Token with a semantic value */
yylval.num = atoi(yytext);
yypush_parse(pstate, TK_NUMBER, &yylval);
}
"dice-roll" { /* sends three random numbers */
for (int i = 0; i < 2; ++i) {
yylval.num = rand() % 6;
yypush_parse(pstate, TK_NUMBER, &yylval);
}
<<EOF>> { /* Obligatory EOF rule */
/* Send the parser the end token (0) */
int status = yypush_parse(pstate, 0, NULL);
/* Free the pstate */
yypstate_delete(pstate);
/* return the parser status; 0 is success */
return status;
}
%define api.pure full
%define api.push-pull push
yylloc
。
yypush_parse
的调用返回的代码。我通常使用的一种解决方案是宏
SEND
的某些变体:
#define SEND(token) do { \
int status = yypush_parse(pstate, token, &yylval); \
if (status != YYPUSH_MORE) { \
yypstate_delete(pstate); \
return status; \
} \
} while (0)
goto
来避免
yypstate_delete
和
return
的多个实例。 YMMV。
yyerror
的原型。如果您正在使用位置和/或为push_parser提供额外的参数,则
yyerror
调用中还将显示位置对象和/或额外的参数。 (错误字符串始终是最后一个参数。)无论出于何种原因,解析器状态对象都不会提供给
yyerror
,这意味着
yyerror
函数不再可以访问诸如
yych
这样的变量,
yypstate
结构的成员而不是全局变量,因此,如果在错误报告中使用这些变量(这不是真正推荐的做法),那么您将不得不寻找替代解决方案。
关于compilation - 如何一次一次灵活地返回多个终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42434603/
我有以下几行代码: using XXX.PAD.PaidServices; using YYY= XXX.PAD.PaidServices.Judet; //// uncomment below fo
我正在寻找一种方法,让 LAN 中的客户端无需任何配置即可找到我的服务器应用程序的所有实例。我不想自己破解某些东西,而是想使用现有的解决方案。就个人而言,我需要用 Python 完成它,但我很乐意听到
我的“问题”或“挑战”有很多问题。但它们都不符合我的需求。好的,我开始了: 我想要一个保存可变属性的数据库。现在我将它们作为列名“硬编码”到数据库中(参见图片)。请参阅“颜色”和“尺寸”。但是如果我想
我正在为我的一个 friend 创建一个网站。我们得到了这些布局,我已经放了一个灵活的背景,可以缩放到当前的浏览器大小。但是放置在背景上的图标需要在缩放窗口时保持相对位置。意味着如果我调整窗口大小,让
案例 通常,您会使用 cellForRowAtIndexPath 委托(delegate)方法来设置单元格。单元格的信息集对于单元格的绘制方式和大小非常重要。 不幸的是,heightForRowAtI
我试图让下面的 div 变得灵活 div { min-width: 500px; max-width: 1000px; width:100%; height: 400px; margin-left:1
我在单元测试方面遇到问题。当我运行测试时,它以 "No tests found" 结束。我正在使用 AppCode 和 Quick/Nimble 框架进行单元测试,但它在 XCode 中也不起作用。
问之前,请理解我的英语不好。 我在 servlet 编程中使用 Class.forName(...) 类。当我访问 servlet 时,我从数据库中获得一行详细的 Controller 信息,指示要使
我创建了一个cron job在 GAE 灵活环境中,每 15 分钟自动运行一次。 但是在创建每个实例时,是否会为每个实例复制相同的 cron 作业?我对此不太确定。 最佳答案 不,不会为每个实例复制
div A 灵活且固定(位于窗口顶部),具有高 z-index,因此下方的元素可以在滚动时从下方通过。 div B 位于 div A 下方,我希望它“粘”在 div A 的底部,因为在调整窗口大小时高
我是 Quick/Nimble 的新手,所以我尝试了一个简单的单元测试: import Quick import Nimble class DarkSkyTests: QuickSpec {
我创建了一个演示。关于表格单元格的灵 active ,我需要一些帮助。 我有一些表格单元格,它们的宽度应该是固定的。 但单元格由标签组成,标签可以是长文本,也可以是短文本。 基于此标签,表格单元格应该
我非常熟悉在代码中需要“水平带”的网站 - 即使他们的内容固定在 960 像素以内,他们的背景也会向左和向右“延伸”。 我知道如何做这些,如果它们只有一种颜色,或者我可以用作背景的一张图片。 最近一位
我在自己编写的网站(无框架或 CMS)上使用 Cloudflare Flexible SSL。一切正常,现在我想在整个网站上使用 HTTPS。我在 Apache Web 服务器上使用 PHP。 我想知
我有这个 Java 接口(interface): public interface Box { public void open(); public void close(); } 这个接
所以我有一个“主要”功能系统,现在可以作为 CMS 使用:用户进入编辑器并从四个模板中选择一个。在模板中,他们单击可以添加图像、文本或两者的部分。 我有一个预览屏幕,可以向他们展示他们正在制作的东西,
下面的 HTML/CSS/Javascript (jQuery) 代码显示了 #makes 选择框。选择一个选项会显示带有相关选项的 #models 选择框。 #makes 选择框偏离中心,#mode
我正在使用固定高度的图像来填充具有渐变颜色的 div,方法如下:背景:透明 url(green_bg.gif) repeat-x scroll 0 0; 但是它只填充一个等于图像高度的高度。根据其中的
我的系统的 GUI 在 1366 X 768 分辨率下运行良好。当它以不同的分辨率显示时,我需要并排滚动,而它不应该这样。此外,当我尝试在 chrome 中按 ctr+- 时,div 和部分变得困惑。
我正在尝试在 google app engine 灵活环境中使用 python 编写日志。 我想使用默认的 python 日志记录库并使用处理程序进行日志记录。这是我的代码: import loggi
我是一名优秀的程序员,十分优秀!