- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 bison 为一种玩具编程语言编写解析器,但我遇到了困难:
我的 grammar.y
文件如下:
%{
#include <stdio.h>
#include "util.h"
#include "errormsg.h"
#define YYDEBUG 1
int yylex(void); /* function prototype */
void yyerror(char *s)
{
EM_error(EM_tokPos, "%s", s);
}
%}
%union {
int pos;
int ival;
string sval;
}
%token <sval> TK_ID TK_STRING
%token <ival> TK_INT
%token <pos>
TK_COMMA TK_COLON TK_SEMICOLON TK_LPAREN TK_RPAREN TK_LBRACK TK_RBRACK
TK_LBRACE TK_RBRACE TK_DOT TK_ASSIGN
TK_ARRAY TK_IF TK_THEN TK_ELSE TK_WHILE TK_FOR TK_TO TK_DO TK_LET TK_IN
TK_END TK_OF TK_BREAK TK_NIL
TK_FUNCTION TK_VAR TK_TYPE
/* Precedence in Bison is weird: lower is higher. Take a look at the spec too. */
%left <pos> TK_OR
%left <pos> TK_AND
%nonassoc <pos> TK_EQ TK_NEQ TK_LT TK_LE TK_GT TK_GE
%left <pos> TK_PLUS TK_MINUS
%left <pos> TK_TIMES TK_DIVIDE
%left <pos> TK_UMINUS
%error-verbose
%start program
%%
/* According to the spec, Tiger programs are just an expression exp. */
program: exp
/* An expression can be many things; consult the spec for more info: Expressions. */
/* For the %prec rule, take a look at 5.4 Context-Dependent Precedence on bison manual */
exp:
lvalue
| TK_NIL
| exp exp_seq_aug
| TK_LPAREN TK_RPAREN
| TK_LET TK_IN TK_END
| TK_INT
| TK_STRING
| TK_MINUS exp %prec TK_UMINUS
| TK_ID TK_LPAREN TK_RPAREN
| TK_ID TK_LPAREN exp params TK_RPAREN
| exp TK_PLUS exp
| exp TK_MINUS exp
| exp TK_TIMES exp
| exp TK_DIVIDE exp
| exp TK_EQ exp
| exp TK_NEQ exp
| exp TK_GT exp
| exp TK_LT exp
| exp TK_GE exp
| exp TK_LE exp
| exp TK_AND exp
| exp TK_OR exp
| TK_ID TK_LBRACE TK_RBRACE
| TK_ID TK_LBRACE TK_ID TK_EQ exp record_exp TK_RBRACE
| TK_ID TK_LBRACK exp TK_RBRACK TK_OF exp
| lvalue TK_ASSIGN exp
| TK_IF exp TK_THEN exp TK_ELSE exp
| TK_IF exp TK_THEN exp
| TK_WHILE exp TK_DO exp
| TK_FOR TK_ID TK_ASSIGN exp TK_TO exp TK_DO exp
| TK_BREAK
| TK_LET decl_seq TK_IN exp_seq_aug TK_END
;
decl_seq:
/* empty */
| decl_seq decl
;
decl:
type_decl
| var_decl
| func_decl
;
var_decl:
TK_VAR TK_ID TK_ASSIGN exp
| TK_VAR TK_ID TK_COLON TK_ID TK_ASSIGN exp
;
func_decl:
TK_FUNCTION TK_ID TK_LPAREN type_fields TK_RPAREN TK_EQ exp
| TK_FUNCTION TK_ID TK_LPAREN type_fields TK_COLON TK_ID TK_EQ exp
;
type_decl:
TK_TYPE TK_ID TK_EQ type
;
type:
TK_TYPE
| TK_LBRACE type_fields TK_RBRACE
| TK_ARRAY TK_OF TK_ID
;
type_fields:
/* empty */
| TK_ID TK_COLON TK_ID type_fields
| TK_COMMA TK_ID TK_COLON TK_ID type_fields
;
lvalue:
TK_ID
| lvalue TK_DOT TK_ID
| lvalue TK_LBRACK exp TK_RBRACK
;
exp_seq:
/* epsilon */
| TK_SEMICOLON exp
| exp_seq TK_SEMICOLON exp
;
exp_seq_aug:
TK_LPAREN exp_seq TK_RPAREN
;
params:
/* epsilon */
| params TK_COMMA exp
;
record_exp:
/* epsilon */
| record_exp TK_COMMA TK_ID TK_EQ exp
;
这没什么特别的,而且几乎没有 (96) 次移位/归约冲突(我猜这很可能是由于 if 语句和函数调用语句)。我知道它应该没有什么要清楚的,但是同一练习的其他替代实现可以清楚地解析更多的移位/减少冲突,所以考虑到我也收到的错误消息,这应该没什么大不了的。
token 文件由 bison 根据 %token
指令(y.tab.h 和 y.tab.c)生成,我得到的具体错误消息是:
nlightnfotis@frodo ~/Software/tigerc $ ./a.out tests/test4.tig
tests/test4.tig:2.1: syntax error, unexpected TK_GE
Parsing failed
这非常令人沮丧,因为解析器说它找到了一个大于或等于的标记,而测试文件没有:
/* define a recursive function */
let
/* calculate n! */
function nfactor(n: int): int =
if n = 0
then 1
else n * nfactor(n-1)
in
nfactor(10)
end
我怎么可能调试这个?
[编辑]:根据要求,这是我的 flex
词法分析器的源代码:
%{
#include <string.h>
#include "util.h"
#include "tokens.h"
#include "errormsg.h"
int charPos = 1;
int
yywrap (void)
{
charPos = 1;
return 1;
}
// Adjust the token position in the string
// Mainly used for error checking
void
adjust (void)
{
EM_tokPos = charPos;
charPos += yyleng;
}
%}
/* Will be used for conditional activation of the comment rule. */
%x C_COMMENT
digits [0-9]+
letters [_a-zA-Z]+
%%
" " {adjust(); continue;}
\n {adjust(); EM_newline(); continue;}
\t {adjust(); continue;}
"/*" {adjust(); BEGIN(C_COMMENT);}
<C_COMMENT>[^*\n] {adjust();}
<C_COMMENT>"*/" {adjust(); BEGIN(INITIAL);}
\"(\\.|[^"])*\" {adjust(); yylval.sval = String(yytext); return STRING;}
"," {adjust(); return COMMA;}
";" {adjust(); return SEMICOLON;}
":" {adjust(); return COLON;}
"." {adjust(); return DOT;}
"+" {adjust(); return PLUS;}
"-" {adjust(); return MINUS;}
"*" {adjust(); return TIMES;}
"/" {adjust(); return DIVIDE;}
"=" {adjust(); return EQ;}
"<>" {adjust(); return NEQ;}
"<" {adjust(); return LT;}
"<=" {adjust(); return LE;}
">" {adjust(); return GT;}
">=" {adjust(); return GE;}
"&" {adjust(); return AND;}
"|" {adjust(); return OR;}
":=" {adjust(); return ASSIGN;}
"(" {adjust(); return LPAREN;}
")" {adjust(); return RPAREN;}
"{" {adjust(); return LBRACE;}
"}" {adjust(); return RBRACE;}
"[" {adjust(); return LBRACK;}
"]" {adjust(); return RBRACK;}
for {adjust(); return FOR;}
if {adjust(); return IF;}
then {adjust(); return THEN;}
else {adjust(); return ELSE;}
while {adjust(); return WHILE;}
to {adjust(); return TO;}
do {adjust(); return DO;}
let {adjust(); return LET;}
in {adjust(); return IN;}
end {adjust(); return END;}
of {adjust(); return OF;}
break {adjust(); return BREAK;}
nil {adjust(); return NIL;}
function {adjust(); return FUNCTION;}
var {adjust(); return VAR;}
type {adjust(); return TYPE;}
array {adjust(); return ARRAY;}
{digits} {adjust(); yylval.ival = atoi (yytext); return INT;}
{letters}[a-zA-Z0-9_]* {adjust(); yylval.sval = String (yytext); return ID;}
. {adjust(); EM_error (EM_tokPos,"illegal token");}
最佳答案
How can I possibly debug this?
对于初学者,您需要学习使用 Bison 调试选项。这将输出所有状态的转储,诚然,调试它们需要很多耐心和时间,乍一看,您通常至少可以缩小导致问题的规则范围。
就您的问题而言,您的词法分析器没有返回 bison 定义的标记。
例如,在 Bison 中你有 %token TK_GE
,但你的词法分析器返回 GE
。 Bison 语法只知道 TK_GE,这就是它所期望的。如果我记得的话,它会将标记定义为 ASCII 序列之上的递增数字序列,并且您必须在词法分析器中使用这些值。
除非你正在做一些我在 tokens.h 中看不到的重新定义,否则你需要重写词法分析器来做:
">=" {adjust(); return TK_GE;}
可能你在某处有 #define GE 42
,但 bison 正在使用 #define TK_GE 21
(示例值)生成 token 文件。
关于compiler-construction - GNU Bison : Syntax Error, 意外 <token>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26443728/
我正在开发一个应用程序,它使用 OAuth - 基于 token 的身份验证。 考虑到我们拥有访问和刷新 token ,这就是流程的样子。 Api call -> intercepter append
如何取消标记此代码的输出? 类(class)核心: def __init__(self, user_input): pos = pop(user_input) subject = ""
当我使用命令 kubectl 时与 --token标记并指定 token ,它仍然使用 kubeconfig 中的管理员凭据文件。 这是我做的: NAMESPACE="default" SERVICE
我正在制作 SPA,并决定使用 JWT 进行身份验证/授权,并且我已经阅读了一些关于 Tokens 与 Cookies 的博客。我了解 cookie 授权的工作原理,并了解基本 token 授权的工作
我正在尝试从应用服务获取 Google 的刷新 token ,但无法。 日志说 2016-11-04T00:04:25 PID[500] Verbose Received request: GET h
我正在开发一个项目,只是为了为 java 开发人员测试 eclipse IDE。我是java新手,所以我想知道为什么它不起作用,因为我已经知道该怎么做了。这是代码: public class ecli
我正在尝试使用 JwtSecurityTokenHandler 将 token 字符串转换为 jwt token 。但它出现错误说 IDX12709: CanReadToken() returned
我已阅读文档 Authentication (来自 Facebook 的官方)。我仍然不明白 Facebook 提供的这三种访问 token 之间的区别。网站上给出了一些例子,但我还是不太明白。 每个
我的部署服务器有时有这个问题,这让我抓狂,因为我无法在本地主机中重现,我已经尝试在我的 web.config 中添加机器 key ,但没有成功远。 它只发生在登录页面。 我的布局:
我已经设法获得了一个简单的示例代码,它可以创建一个不记名 token ,还可以通过阅读 stackoverflow 上的其他论坛来通过刷新 token 请求新的不记名 token 。 启动类是这样的
如果我有以前的刷新 token 和使用纯 php 的访问 token ,没有 Google Api 库,是否可以刷新 Google Api token ?我在数据库中存储了许多用户刷新和访问 toke
我通过 Java 应用程序使用 Google 电子表格时遇到了问题。我创建了应用程序,该应用程序运行了 1 年多,没有任何问题,我什至在 Create Spreadsheet using Google
当我有一个有效的刷新 token 时,我正在尝试使用 Keycloak admin REST API 重新创建访问 token 。 我已经通过调用 POST/auth/realms/{realm}/p
我正在尝试让第三方 Java 客户端与我编写的 WCF 服务进行通信。 收到消息时出现如下异常: Cannot find a token authenticator for the 'System.I
在尝试将数据插入到我的 SQl 数据库时,我收到以下错误 System.Data.SqlServerCe.SqlCeException: There was an error parsing the
使用数据库 session token 系统,我可以让用户使用用户名/密码登录,服务器可以生成 token (例如 uuid)并将其存储在数据库中并将该 token 返回给客户端。其上的每个请求都将包
我最近注册了 Microsoft Azure 并设置了认知服务帐户。使用 Text Translation API Documentation 中的说明我能够使用 interactive online
我使用 IAntiforgery API 创建了一个 ASP.Net Core 2 应用程序。 这提供了一种返回 cookie 的方法。 客户端获取该 cookie,并在后续 POST 请求中将该值放
我正在使用 spacy 来匹配某些文本(意大利语)中的特定表达式。我的文本可以多种形式出现,我正在尝试学习编写一般规则的最佳方式。我有如下 4 个案例,我想写一个适用于所有案例的通用模式。像这样的东西
我无法理解 oauth 2.0 token 的原则处理。 我的场景是,我有一个基于 web 的前端后端系统,带有 node.js 和 angular 2。用户应该能够在此站点上上传视频。然后创建一些额
我是一名优秀的程序员,十分优秀!