如何在不使用%prec或%left的情况下在Bison中设置优先级和关联性?有没有办法在不需要的地方编写语法?
我有一个语法,它使用括号和方括号作为分隔符.当bison生成的解析器被赋予带有不平衡分隔符的输入时,YYLTYPE*传递给的传入的错误位置yyerror是输入的结尾.所以,例如,在输入中xx(yy,void yyerror(YYLTYPE* yylloc, Context* ctx, const char* msg)我有这个yylloc->first_column == yylloc->last_column == 5.不幸的是,输入的结尾不是指示不匹配分隔符的最显着位置.更有用的是左括号或左方括号的位置,没有匹配.(在该示例中,这将是左括号在偏移2)我推测,此信息可用在分析堆---必须有一些Ñ使得$-n是不匹配(或[令牌,并@-n是YYLTYPE结构保持其位置---但似乎没有一个可用yyerror.我知道我可以保留一堆我自己用于跟踪分隔符的偏移并隐藏在Context我已经传递的内容中yyerror,但这似乎是不优雅和重复的,因为野牛已经在跟踪这个.
那么:如何从bison中获得它在输入中遇到的第一个不平衡分隔符的位置,以便在为解析错误生成消息时可以使用它?
我有一个 C 库,我想在不修改库的情况下与 C++ 代码进行交互。它有一个 yacc 生成的前端,可以读取yyin,这是一个FILE *. 我想设置yyin某种从内存中读取的模拟FILE *。是否有希望以可移植(Linux、Mac、Windows)的方式做到这一点——或者是否有其他技巧可以让这样的解析器从内存而不是读取FILE *?
我执行的语言,有两家运营商之间的冲突| * |和* || *-第一个是"规范"操作,其中两个|-characters环绕的表达,另一个是运营商还是,其中两个表达式三明治2个|-characters.
到目前为止,我能够解析类似的表达式||| a || b | | |- 即单个或三个级别的规范或(规范中任意数量的规范和任何系列的或运算符); 这只适用于表达式的尾部包含|彼此之间有空格的字符 - 即||| a || b | | |可以工作,但||| a || b |||会导致语法错误.我希望能够将最后一个版本解析为a or b内部的三个规范.
我的实现的简约版本(即相关部分):
野牛/ Yacc部分:
%token NUM
%token OR
%token NORM
%right LOR ROR
%right NORM
%right OR
%right '|'
%%
expression:
NUM
| lnorm expression rnorm %prec NORM
| expression LOR ROR expression %prec OR …Run Code Online (Sandbox Code Playgroud) 如何$$使用 Yacc/Bison 获取语法的起始规则的“返回”值(变量)?
yyparse 返回解析器的错误代码。
我需要使用 ply 从正则表达式创建 AST。例如,如果 RE 是 (a|b*)abc,我想将一个配对元组制作为 (':', (':', (':', ('|', 'a', ('* ', 'b')), 'a'), 'b'), 'c') <-- ':' 表示将字符串分成两部分。
这是我的代码。
tokens = (
"SYMBOL",
"LBRACKET",
"RBRACKET",
"STAR",
"UNION"
)
t_ignore = ' \t\n'
t_SYMBOL = r'[a-zA-Z0-9]'
t_LBRACKET = r'\('
t_RBRACKET = r'\)'
t_STAR = r'\*'
t_UNION = r'\|'
def t_error(t):
raise TypeError("Unknown text '%s'" % t.value)
def p_multiple(p) :
'''string : SYMBOL SYMBOL
| string SYMBOL
| string string'''
p[0] = (':', p[1], p[2])
def p_union(p) :
'''string …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Flex 和 Bison 为简单的格式化语言构建一个编译器。我还处于起步阶段,我已经编写了一些功能。
不过,在这个阶段,我仍然没有将yyout任何东西打印到任何地方。我有一些错误情况,其中输出文件中打印了某些内容,但此输入显然不会发生这种情况。我所有的其他打印语句都将打印到控制台。因此,我希望输出文件将完全为空。但是,当我尝试使用以下内容作为我的输入文件时:
\begin {document}
\tabsize( 5)
\title{"Why I Love Compiler Design"}
\author{"COMP421 Student"}
\date{29/12/2016}
\pagesetup{30,100 }
\end{document}
Run Code Online (Sandbox Code Playgroud)
生成的输出文件为:
有 9 行空行,对应于我在输入文件中的 9 行。然而,我期望的输出只有 1 个空行。
这是我的.l文件:
\begin {document}
\tabsize( 5)
\title{"Why I Love Compiler Design"}
\author{"COMP421 Student"}
\date{29/12/2016}
\pagesetup{30,100 }
\end{document}
Run Code Online (Sandbox Code Playgroud)
这是我的.y文件:
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "y.tab.h"
void yyerror(const char *);
int yylex(void);
/* "Connect" with the output file */
extern FILE *yyout;
extern int yyparse(); …Run Code Online (Sandbox Code Playgroud) 我有以下yacc语法:
%{
#include <stdio.h>
extern FILE* yyin;
extern char* yytext;
%}
%token VAR ID_NAME TYPE_STRING TYPE_BOOL TYPE_NUMBER CONST
%%
var_declaration: VAR ':' type ID_NAME ';' { printf("var\n"); }
;
const_declaration: CONST ':' type ID_NAME ';' {printf("const\n");}
;
type: TYPE_NUMBER
| TYPE_STRING
| TYPE_BOOL
;
%%
void yyerror (char const *s) {
fprintf (stderr, "%s\n", s);
}
int main(int argc, char** argv[])
{
yyparse();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它应该描述一种小语言,此时应该允许表单的变量声明var:<type> <name>;和表单的常量声明const:<type> <name>;。
当我运行时,yacc -vd grammar.y我得到: …
适用于iPad和iPhone的iOS是否支持解析器?特别是,lex/yacc或flex/bison可用于iOS开发吗?xcode4是否有本机支持的库?(我可以通过lex/yacc生成我的语法,然后获取*.c文件并将它们放入我的项目中,但我希望有更严格支持的库.)
有任何想法吗?