- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Flex 和 bison 很陌生,我正在做一个比较数字的应用程序。如果 a > b 将返回 0,a < b 将返回 1但是,当涉及到 &、|、== 时我遇到了问题这是我的输出示例:
>> a = 5
5
>> b = 8
8
>> a < b & a < b
1
>> syntax error
我不知道如何解决这个问题。以下是编译器的一些提示:
[tpham14@linux5 ~/331] make -f mymake calc
bison -d -o y.tab.c -v calc.y
calc.y: warning: 16 shift/reduce conflicts [-Wconflicts-sr]
calc.y: warning: 6 reduce/reduce conflicts [-Wconflicts-rr]
cc -c -o y.tab.o y.tab.c
cc -c -o lex.yy.o lex.yy.c
cc -o calc y.tab.o lex.yy.o
这是我的 calc.y 文件:
%{
#include "calc.h"
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
/************************************************************************
* Defines a yacc grammar for a simple calculator using infix
* notation. WHen executed, the calculator enters a loop in
* which it prints the prompt >>, reads a toplevel expression
* terminated by a newline, and prints its value. Operators
* include +, -, *, and = (assignment). Note that all
* expressions return values, even assignment. Parentheses
* can be used to override operator precedence and
* associativity rules. Based on zcalc by ruiz@capsl.udel.edu
************************************************************************/
int yylex();
int yyparse();
%}
/*
Th union directive specifies the collection of tpes our grammar
deals with -- just doubles and pointers to symbol table entries.
*/
%union {
double dval;
struct symtab *symp;
}
/*
Declare the token types and any associated value types. We made
EQ a token in calc.l because otherwise '=' and '==' would clash.
*/
%token <symp> NAME
%token <dval> NUMBER
%token EQ
%token GT
%token LT
%token OR
%token AND
%token NOT
%token IF
%token ELSE
/* The folowing declarations specify the precidence and associativity
of our operators. The operators -, +, * and / to be left
associative, * and EQ to be right associative and UMINUS to be
non-associative (since it is a unary operator). The '=' operator
has the lowest precedence and UMINUS the highest.
*/
%right '=' /*lowest precedence*/
%right EQ GT LT
%left '-' '+'
%left '*' '/'
%left '&'
%nonassoc OR AND NOT
%nonassoc IF
%nonassoc ELSE
%nonassoc UMINUS /* highest precedence */
/*
Declare the type of expression to be a dval (double).
*/
%type <dval> expr
%type <dval> smallexprs
%%
/*
Here are our grammar rules. a session is a sequence of lines. A
toplevel is just an expr (print its value followed by two
newlines and the prompt >>) or a '? (print help) or a '.' (exit).
An expr can be a number, name, the sum of two exprs, ...
*/
session: /* empty */
|session toplevel '\n'
;
toplevel: expr { printf("%g\n\n>> ", $1); }
| /*empty*/
| '?' { printHelp(); printf("\n>> "); }
| '.' { printf("Exiting 331 calc\n"); exit(1); }
expr: smallexprs { $$ = $1; }
| NAME { $$ = $1->value; }
| NAME '=' expr { $1->value = $3; $$ = $3; }
| IF expr expr expr { if($2 == 1) $$ = $3; else $$ = $4; }
| smallexprs AND smallexprs { $$ = $1 && $3; }
| smallexprs OR smallexprs { $$ = $1 || $3; }
| smallexprs EQ smallexprs { $$ = $1 == $3; }
| expr GT expr { $$ = $1 > $3; }
| expr LT expr { $$ = $1 < $3; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
smallexprs: NUMBER { $$ = $1; }
| IF smallexprs smallexprs smallexprs { if($2 == 1) $$ = $3; else $$ = $4; }
| smallexprs EQ smallexprs { $$ = $1 == $3; }
| smallexprs GT smallexprs { $$ = $1 > $3; }
| smallexprs LT smallexprs { $$ = $1 < $3; }
| smallexprs '+' smallexprs { $$ = $1 + $3; }
| smallexprs '-' smallexprs { $$ = $1 - $3; }
| smallexprs '*' smallexprs { $$ = $1 * $3; }
| smallexprs '/' smallexprs { $$ = $1 / $3; }
| '~' smallexprs %prec UMINUS { $$ = -$2; }
| '(' smallexprs ')' { $$ = $2; }
%%
struct symtab *
symlook(s)
char *s;
{
char *p;
struct symtab *sp;
/* given the name of a symbol, scan the symbol table and
either return the entry with matching name or add it
to the next free cell in the symbol table. */
for(sp = symtab; sp < &symtab[SYMBOLTABLESIZE]; sp++) {
/* If the symbol table entry has a name and its equal
to the one we are looking for, return this entry */
if (sp->name && !strcmp(sp->name, s))
return sp;
/* If the name is empty then this entry is free, so the
symbol must not be in the table and we can add it here
and return this entry. */
if (!sp->name) {
sp->name = strdup(s);
return sp;
}
}
/* We searched the entire symbol table and neither found
the symbol or an unused entry. So the table must be
full. Sigh. */
yyerror("The symbol table is full, sorry...\n");
exit(1);
}
void printHelp()
{ /* print calculator help and return */
printf("Enter an expression in infix notation followed by a newline.\n");
printf("Operators include +, -, * and =. Defined functions include\n");
printf("sqrt, exp and log. You can assign a variable using the =\n");
printf("operator. Type . to exit. Syntax errors will terminate the\n");
printf("program, so be careful.\n");
}
/* If error prints error and Do not accept to signify bad syntax in
program */
void yyerror(char *msg) /* yacc error function */
{
printf("%s \n" , msg);
}
int yywrap(){return 1;}
int main()
{ /* print herald and call parser */
printf("331 Calculator\n(type ? for help and . to exit)\n\n>> ");
yyparse();
return 0;
}
下面是我的 calc.l 文件:
%{
#include "y.tab.h"
#include "calc.h"
#include <math.h>
/************************************************************************
A lexical scanner to recognize numbers, symbols and the EQ
operator. When a NUMBER is found, its value is set is set to the
appropriate float. When a NAME is found, an entry in symbol table is
created (with initial value 0.0) and the token's value is a pointer to
this entry. If a '==' sequence is seen, it is returned as a token
EQ. Spaces and tabs are ignored. Any other characters, including
a newline, are passed on as their own tokens. Based on the zcalc
calculator by ruiz@capsl.udel.edu
************************************************************************/
%}
D [0-9]
A [a-zA-Z]
AD [a-zA-Z0-9]
%%
({D}+|({D}*\.{D}+)([eE][-+]?{D}+)?) {yylval.dval = atof(yytext); return NUMBER;}
if {return IF;}
or {return OR;}
and {return AND;}
not {return NOT;}
{A}{AD}* {struct symtab *sp = symlook(yytext); yylval.symp = sp; return NAME;}
"==" {return EQ;}
">" {return GT;}
"<" {return LT;}
[ \t] ;
\n |
. return yytext[0];
%%
下面是我的 calc.h 文件:
#define SYMBOLTABLESIZE 30
/* An entry in the symbol table has a name, a pointer to a function,
and a numeric value. */
struct symtab {
char *name;
double (*funcptr)();
double value;
} symtab[SYMBOLTABLESIZE];
struct symtab *symlook();
void printHelp();
void yyerror();
最佳答案
语法错误没有规则匹配或包含&
&& 标记在您的 lex 规范中定义为“and”,您应该检查
a < b and a < b
或将 lex 规范更改为
&& { return AND;}
|| { return OR;}
! { return NOT;}
GT 移位后,减少 Px 作为小表达式跟随包含 GT类似地,LT、+、-、*。 (6 转移/减少冲突)
expr: smallexprs --- Px
smallexprs: smallexprs .GT smallexprs ---Sy
expr: smallexprs EQ smallexprs .
smallexprs: smallexprs EQ smallexprs .
减少/减少expr和smallexprs的Follow冲突(6个减少/减少冲突)
关于c - Flex 和 Bison 逻辑运算符语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780417/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!