请问我面临一个简单的问题..这是问题,在我的lex文件中我有类似的东西:
char *ptr_String;
"name = " { BEGIN sName; }
<sName>.+ {
ptr_String = (char *)calloc(strlen(yytext)+1, sizeof(char));
strcpy(ptr_String, yytext);
yylval.sValue = ptr_String;
return NAME;
}
Run Code Online (Sandbox Code Playgroud)
现在在我的Yacc文件中,我有类似于:
stmt_Name:
NAME
{
/*Now here i need to get the matched string of <sName>.+ and measure it's length. */
/*The aim is simply outputing the name to the screen and storing the length in a global variable.
}
;
Run Code Online (Sandbox Code Playgroud)
请问有什么建议?非常感谢您的所有时间和帮助.
我正在寻找一个活跃的Lex和Yacc或Bison IRC - (互联网中继聊天).任何建议都非常感谢.
在此先感谢您的帮助!
我正在设计要在禁止使用动态内存的嵌入式环境中运行的软件。Lex和Yacc非常适合该应用程序。
我可以配置Lex和Yacc完全不使用动态内存分配吗?
是否可以将Lex和Yacc配置为使用预定义的内存块,并将动态内存使用限制为该预定义的空间?
是否可以将动态内存的使用限制为仅对程序进行初始化(即程序首次运行时)?
编辑: 作为对TonyK的响应,我希望解析器不使用动态内存。
谢谢
我已经读过Xcode 4(我想以前的版本)内置了对Yacc和Lex的支持,我正在学习.我正在尝试建立一个简单的项目来测试它们,但由于我是Xcode和Yacc/Lex的新手,我似乎无法找到正确的方法.
任何人都可以推荐在Xcode 4中使用Yacc/Lex的有用指南或教程吗?
我试图使用PLY库中为Python提供的yacc解析器来解析字符串.解析器本身很长,但我遇到的问题是它总是给我同样的错误,无论我放什么样的字符串.错误是这样的:
yacc:输入中的解析错误.EOF
而词法分析器运行完美,所以我认为解析器就是问题所在.但我不明白这个错误,所以我甚至不知道在哪里首先要解决这个问题
有任何想法吗?非常感谢你!
这更像是一个"原则上"问题,而不是一个实际问题.是Yacc减少产生的顺序,并从定义的词法分析器中读取新的标记.也就是说,如果我有以下一组令牌:
INTEGER_BEGIN
INTEGER_VALUE
LESS_THAN
INTEGER_BEGIN
INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
Yacc可以在其语义中读取LESS_THAN词法分析器中的令牌,然后将其缩减INTEGER BEGIN INTEGER_VALUE为单个内容,给出一组产生,例如:
expr : expr LESS_THAN expr
| integer
integer : INTEGER_BEGIN INTEGER_VALUE
Run Code Online (Sandbox Code Playgroud)
如果使用语义操作定义了这些更改的规则吗?
我有使用复制字符串lexeme的flex代码strdup().
%{
#include "json.tab.h"
#define YY_DECL extern "C" int yylex()
%}
%option noyywrap
%%
[ \t\n]+ ;
\"[a-zA-Z]+\" {yylval.sval = strdup(yytext); return STRING; }
[0-9]+ {yylval.ival = atoi(yytext); return NUMBER; }
. {return yytext[0];} ;
%%
Run Code Online (Sandbox Code Playgroud)
strdup()分配内存并将输入字符串复制到其中并返回(strdup() - 它在C中做了什么?),所以我想当我不再需要它时我需要释放它.
从这篇文章:什么是在BISON中调用%析构函数?,我%destructor { free($$); printf("free");} STRING在yacc文件中添加了.
但是,free()即使yylval.sval从返回的新字符串赋值,我也看不到调用strdup().
可能有什么问题?如何释放flex/bison中分配的字符串?
我想如下使用静态分配的sval:
%union {
int ival;
char sval[100]; // char* sval;
}
Run Code Online (Sandbox Code Playgroud)
flex代码现在变为(如果yytext小于100字节,则没有检查代码):
\"[a-zA-Z]+\" {
//yylval.sval = strdup(yytext);
memset(yylval.sval, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用golang的yacc工具创建一个解析器.我发现nex可以简化创建词法分析器以提供解析器.我现在的问题是生成的解析器没有方法或字段来授予我访问解析结果的权限.我可以将解析结果存储在全局变量中,但这似乎是错误的.
目前,我已将以下内容添加为我的parser.y文件顶部的初始尝试:
type ResultParser interface {
yyParser // Generated parser interface
Result() s.Expr // s.Expr is an interface for the parsed result
}
func (p *yyParserImpl) Result() s.Expr {
return p.stack[1].expr
}
func NewResultParser() ResultParser {
return &yyParserImpl{}
}
Run Code Online (Sandbox Code Playgroud)
是否有一种推荐/更好的方法来获得解析器的结果?
(因为这感觉有点滥用发电机......)
我正在尝试使用 lex 和 yacc 为计算器开发程序。我不断收到以下错误:
calc.y: warning: 5 nonterminals useless in grammar [-Wother]
calc.y: warning: 8 rules useless in grammar [-Wother]
calc.y:8.1: fatal error: start symbol I does not derive any sentence
I : E '\n' {printf("%d\n",$1);}
Run Code Online (Sandbox Code Playgroud)
我查看了类似的问题,但它们有无限递归,但这个没有 .
计算量
%{
#include"y.tab.h"
%}
digits [0-9]*
%%
{digits} {return DIGITS}
%%
int yywrap()
{
}
Run Code Online (Sandbox Code Playgroud)
钙化
%{
#include<stdio.h>
%}
%token DIGITS
%%
I : E '\n' {printf("%d\n",$1);}
;
E : E '+' F {$$ = $1 + $3;}
| E '-' …Run Code Online (Sandbox Code Playgroud) 莱克斯部分:
%%
[0-9]+ { yyval = atoi (yytext); return num; }
%%
Run Code Online (Sandbox Code Playgroud)
Yacc 部分:
%token num
%%
exp:num '+' num ; {$$ = $1 + $3;}
%%
Run Code Online (Sandbox Code Playgroud)
$$,$1和$2代表什么?$$?5+9作为输入发送到该程序5并被9lex 程序识别,但是 呢+?符号+是否发送到 lex?