- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
抽象语法。实际语法如下:
start -> t1 V1;
V1 --> t2 V1
| t3 V2
;
V2 --> t4
| /* Empty */
;
当控件处于 V2 并遇到 token t3 时。控制回到 V1。好了到此为止。
但是控制并没有停在V1触发t3,而是回到开始,这就是问题所在。
实际语法。解释如下。
%{
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
void yyerror (char *s);
extern FILE *yyin;
%}
%token MAIN
%token INT_DT INT_LIT /* t_INT_DT --> Integer Data type, i.e. "int"
* t_INT_LIT --> An integer, i.e. "5".
*/
%token VAR // A variable
%token SCANF PRINTF // For the printf and the scanf statements.
%token IF ELSE // For the if and else statements.
%token GOTO
%token OPRTR // For the operator in an expression.
/* Begining of a basic block, BBS, Basic Block Statement.
* BBS_ST = "<bb "
* BBS_END1 ">:"
* BBS_END2 ">;"
* Example:
* <bb 2>:
* Statements;
* goto <bb 3>;
*/
%token BBS_ST // "<bb "// it is "<bb ".
%token BBS_END1 // ">:"
%token BBS_END2 // ">;"
// Opening and closing Braces, i.e. { & }
%token OP_BR // "{"
%token CL_BR // "}"
// For opening and closing Parantheses, ( & )
%token OP_PR //"("
%token CL_PR //")"
%token EQUAL // "="
%token COMMA // ","
%token NBSP // "&"
%token SM_CLN // ";" // For ";"
%token RETURN // For the return statement.
%start begin
%%
begin: MAIN main ;
main: OP_BR functn CL_BR ;
functn: INT_DT VAR SM_CLN functn /*Recursion to stay in functn */
| BBS_ST INT_LIT BBS_END1 bb
;
bb: SCANF var_List CL_PR SM_CLN bb
| PRINTF var_List CL_PR SM_CLN bb
| VAR EQUAL expr SM_CLN bb
| IF OP_PR expr CL_PR bb
| ELSE bb
| GOTO BBS_ST INT_LIT BBS_END2
| RETURN SM_CLN
| /* Empty Rule. */
; /* bb has can't catch BBS_ST as first token, thus it must return
* to the calling rule and functn can catch BBS_ST. */
var_List: COMMA VAR var_List
| /* Empty Rule. */
;
expr: VAR expr2
| INT_LIT expr2
;
expr2: OPRTR expr3
| /* Empty Rule */
;
expr3: VAR
| INT_LIT
;
%%
int main (int argc, char *argv[])
{
#if YYDEBUG == 1
extern int yydebug;
yydebug = 1;
#endif
if (argc == 2)
{
yyin = fopen (argv [1], "r");
if (yyin == NULL)
perror (argv [1]);
}
yyparse ();
fclose (yyin);
return 0;
}
void yyerror (char *s)
{
printf ("Error: %s\n", s);
}
到目前为止,实现了答案中建议的想法,但这没有帮助。
begin: MAIN main ;
main: OP_BR functn_Decls CL_BR
;
functn_Decls: functn_Decls INT_DT VAR SM_CLN
| functn
;
functn: functn BBS_ST INT_LIT BBS_END1
| bb
;
bb: bb stmnt
| /* Empty Rule */
;
stmnt: t1 // terminals only.
;
var_List: t2 // terminal just for illustration.
;
expr: t3 // terminal just for illustration.
;
导致输入错误:
main ()
{
<bb 2>:
goto <bb 4>;
<bb 3>:
}
错误:
在 <bb
token BBS_ST 被触发。此时控制在bb中,如bb --> Waiting for a token由于bb中没有以BBS_ST开头的规则,所以返回调用规则。
现在调用规则为functn,其中有一条以BBS_ST开头的规则。问题是,这条规则没有被调用。
相反,控件到达位于 P1 的 functn 的父级。如果在 P1 我添加 BBS_ST,它会捕获此 token 。
请指出为什么会这样?
对应的Flex文件:
%{
// Include the file
#include "Parse_One_Line2.tab.h"
extern YYSTYPE yylval;
extern char *yytext;
%}
LB ^[ \t]*
CH [a-zA-Z]
DI [0-9]
%%
{LB}main[ ]*\([.]*\) return MAIN; // the main() call.
{LB}int[ ] return INT_DT;
[+-]?{CH}({CH}{DI}_)* return VAR;
[+-]?[0-9]+ return INT_LIT;
{LB}scanf[ ]?\(\".*\" return SCANF;
{LB}printf[ ]?\(\".*\" return PRINTF;
{LB}if[ ] return IF; // If statement.
{LB}else[ ] return ELSE; // If statement.
{LB}goto[ ] return GOTO;
{LB}return return RETURN;
\{CLOBBER\}; ;// Ignore it.
"<bb " return BBS_ST; // next integer is a BB Index.
">:" return BBS_END1; // token Greater than Colon.
">;" return BBS_END2;
^;;[^\n]*[\n] ; // Ignore it, comment.
"+"|"-"|"*"|"/"|"%"|"=="|">="|"<="|"<"|">"|"!=" return OPRTR;
^[{] return OP_BR; // It is "{".
^[}] return CL_BR; // It is "}".
"(" return OP_PR; // Paranthesis Open
")" return CL_PR; // Paranthesis Close
";" return SM_CLN;
"=" return EQUAL;
"&" return NBSP;
"," return COMMA;
[\n] ; /* Skip these characters. */
. ; /* Skip. */
%%
int yywrap (void)
{
return 1;
}
使用 YYDEBUG 标志的输出文件。
Starting parse
Entering state 0
Reading a token: Next token is token MAIN ()
Shifting token MAIN ()
Entering state 1
Reading a token: Next token is token OP_BR ()
Shifting token OP_BR ()
Entering state 3
Reading a token: Next token is token INT_DT ()
Shifting token INT_DT ()
Entering state 6
Reading a token: Next token is token VAR ()
Shifting token VAR ()
Entering state 9
Reading a token: Next token is token SM_CLN ()
Shifting token SM_CLN ()
Entering state 12
Reading a token: Next token is token BBS_ST ()
Shifting token BBS_ST ()
Entering state 7
Reading a token: Next token is token INT_LIT ()
Shifting token INT_LIT ()
Entering state 10
Reading a token: Next token is token BBS_END1 ()
Shifting token BBS_END1 ()
Entering state 13
Reading a token: Next token is token GOTO ()
Shifting token GOTO ()
Entering state 20
Reading a token: Next token is token BBS_ST ()
Shifting token BBS_ST ()
Entering state 29
Reading a token: Next token is token INT_LIT ()
Shifting token INT_LIT ()
Entering state 38
Reading a token: Next token is token BBS_END2 ()
Shifting token BBS_END2 ()
Entering state 47
Reducing stack by rule 10 (line 76):
$1 = token GOTO ()
$2 = token BBS_ST ()
$3 = token INT_LIT ()
$4 = token BBS_END2 ()
-> $$ = nterm bb ()
Stack now 0 1 3 6 9 12 7 10 13
Entering state 22
Reducing stack by rule 4 (line 68):
$1 = token BBS_ST ()
$2 = token INT_LIT ()
$3 = token BBS_END1 ()
$4 = nterm bb ()
-> $$ = nterm functn ()
Stack now 0 1 3 6 9 12
Entering state 14
Reducing stack by rule 3 (line 67):
$1 = token INT_DT ()
$2 = token VAR ()
$3 = token SM_CLN ()
$4 = nterm functn ()
-> $$ = nterm functn ()
Stack now 0 1 3
Entering state 8
Reading a token: Next token is token BBS_ST ()
Error: popping nterm functn ()
Stack now 0 1 3
Error: popping token OP_BR ()
Stack now 0 1
Error: popping token MAIN ()
Stack now 0
Cleanup: discarding lookahead token BBS_ST ()
Stack now 0
最佳答案
我重新整理了您的一些规则。问题是当 functn
看到一个 bb
时,它只期望一个。因此,当到达您的 GOTO
时,预计不会有更多 token 。允许 functn
出现在 bb
语句之后应该可以解决此问题并为您提供所需的行为。
functn: INT_DT VAR ";" functn
| bb_stmt functn
| bb_stmt
;
bb_stmt: BBS_ST /*P2*/ INT_LIT ">:" bb
;
如果你想继续强制语句只在函数的顶部,你可以在上面做一些这样的事情:
main: "{" functn_decls /*P1*/ "}" ;
functn_decls: INT_DT VAR ";" functn_decls
| functn
;
functn: bb_stmt functn
| bb_stmt
;
关于c - 使用 Bison 实现语法。语法控制流意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32203383/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!