我想尝试使用莎士比亚编程语言,所以我从这里下载并使用Makefile执行cd spl-1.2.1 Make.
spl2c带有几个警告的执行汇编:
scanner.l:600: warning, rule cannot be matched
<stdout>:5808: warning: ‘yyunput’ defined but not used
Run Code Online (Sandbox Code Playgroud)
然后当它试图编译所有的例子时,一切都变得混乱:
../spl/bin/spl2c < fibonacci.spl > fibonacci.c
Warning at line 19: equality expected
Warning at line 28: equality expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 30: comment expected
Warning at line 32: comment expected
Warning at line 32: comment expected
Warning at …Run Code Online (Sandbox Code Playgroud) 当我的标记属于我定义的类型时,yacc似乎不喜欢.
在块中我的grammar(.y)文件的顶部%{ ... %},我包含一个定义以下结构的头文件:
typedef struct _spim_register {
spim_register_type type; /* This is a simple enumeration, already defined */
int number;
} spim_register;
Run Code Online (Sandbox Code Playgroud)
在我的规则列表之前,我有:
%token AREG
...
%union {
struct _spim_register reg;
}
...
%type <reg> register AREG
Run Code Online (Sandbox Code Playgroud)
我明白了
错误:字段'reg'的类型不完整
在%union尝试编译由bison生成的代码时,在子句中的行.在我的%union陈述中,尝试通过写入声明reg spim_register reg;给出错误:
unknown type name ‘spim_register’
Run Code Online (Sandbox Code Playgroud)
看起来有一些特别之处%union { ... },因为我能够在规则的操作中使用头文件中的数据结构.
我想扩展php语法,以区分可变和不可变的变量.
$a应该被声明为可变的(如在标准的php中)并且#b应该被声明为不可变的.
我读过Hacking PHP语法,
我无法弄清楚我在哪里可以定义声明的变量#也应该被标记为T_VARIABLE?
我有一个应用程序,我已经有一种语法的解析器,我需要为另一个目的添加第二个不同的语法.
是否有可能有多个?
如果是这样,你如何获得另一个切入点?
谢谢
大卫艾伦芬奇
我想在c ++中进行一些解析和标记以用于学习目的.现在我经常在网上阅读这个主题时遇到野牛/ yacc和lex.使用STL或boost :: regex或者甚至只是C编写的标记器/解析器是否会有任何市长的好处?
我正在编写一个处理评论的程序以及其他一些东西.如果评论在特定的地方,那么我的程序会做一些事情.
Flex在发现评论时传递令牌,然后Bison会查看该令牌是否符合特定规则.如果是,则需要与该规则相关联的操作.
事情就是这样:我收到的输入实际上可能在错误的地方有评论.在这种情况下,我只想忽略注释而不是标记错误.
我的问题:
如果令牌符合规则,我如何使用令牌,但如果不符合则忽略它?我可以将令牌设为"可选"吗?
(注意:我现在能想到的唯一方法就是在每个可能的规则中将注释标记分散到每个可能的位置.必须有一个比这更好的解决方案.也许有一些涉及根的规则?)
我正在使用Bison和Flex来制作一个可重入的扫描器/解析器对,但无法将我的头包裹在所有要包含和声明的内容中.
首先,我正在使用可重入的Flex,因此我需要首先将yyscan_t扫描仪类型传递给Bison %parse-param {yyscan_t scanner},然后通过声明将Bison传递给Flex %lex-param {yyscan_t scanner}.但是yyscan_tBison没有声明,所以我必须在我的Bison文件中包含Flex生成的扫描程序头文件(我将其命名为scanner.flex.h).但由于我的Flex文件包含了我的Bison标题,而我的Bison标题现在包含了Flex标题,因此我得到循环包含以不可预测的方式混淆内容!
让我们说我想%locations在我的Bison文件和%bison-locations我的Flex文件中添加位置跟踪.现在我需要更改我的yyerror和yylex的声明(似乎我必须定义yylex AGAIN,即使它是在Flex生成的头中定义的但我不能包括那个,记得吗?)我的Bison文件中的函数包含YYLTYPE指针.但现在呢?似乎在插入序言之后放置了默认的YYLTYPE声明,因此我不能在我的yyerror和yylex的声明中使用这个默认的YYLTYPE.
我意识到这些问题有很多变通方法......但是你应该怎么做呢?它完全逃脱了我,这只是让我头晕目眩......
当使用带有空右侧的规则编写("理论")语法时,总是使用诸如ε(或1)之类的符号来使这个空白显式:
A ? ? | a A
Run Code Online (Sandbox Code Playgroud)
Yacc和其他人的这种语法看起来就像
a: | 'a' a
Run Code Online (Sandbox Code Playgroud)
或"更糟"
a: { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
事实上,在"真实世界语法"(Yacc,Bison等)规则的这个空的右侧部分没有明确标记为空的麻烦我:很容易错过rhs空的事实,或者更糟糕的是:忘记插入|并实际使用中规则操作:
a: { $$ = new_list(); }
a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
1)我不知道有任何工具可以提供显式空rhs的方法.有吗?
Bison的未来版本可能支持专用符号,在非空rhs中使用时会出现错误,而在留下隐式空rhs时会出现警告.
2)人们认为这有用吗?
3)你建议的符号是什么?
目前,候选人是$empty:
a: $empty { $$ = new_list(); }
| a 'a' { $$ = $1; $$->append($1); }
;
Run Code Online (Sandbox Code Playgroud)
选择的语法是%empty:
a: %empty { $$ = …Run Code Online (Sandbox Code Playgroud) 我正在构建一个词法和语法分析器.当我尝试将flex与我的.l文件一起使用时,我收到以下警告.
littleDuck.l:26: warning, rule cannot be matched
Run Code Online (Sandbox Code Playgroud)
规则26是以{cteI}开头的规则,我的规则部分如下:
[ \t\n] ;
{RW} {return RESERVED;}
{id} {return ID;}
{ops} {return OPERATOR;}
{seps} {return SEPARATOR;}
{cteI} {yylval.ival = atoi(yytext); return INT;}
{cteF} {yylval.fval = atof(yytext); return FLOAT;}
{ctestring} {yylval.sval = strdup(yytext); return STRING;}
. ;
Run Code Online (Sandbox Code Playgroud)
另外,我的定义部分是这样的:
RW program|var|int|float|print|else|if
id ([a-z]|[A-Z)([a-z]|[A-Z]|[0-9])*
ops "="|"<"|">"|"<>"|"+"|"-"|"/"|"*"
seps ":"|","|";"|"{"|"}"|"("|")"
cteI [0-9]+
cteF {cteI}(\.{cteI}((e|E)("+"|"-")?{cteI})?)?
ctestring (\".*\")
Run Code Online (Sandbox Code Playgroud)
为什么会出现此警告,如何修改我的文件以使其不显示?
总体问题是:
怎么我的语法有看起来像允许任意嵌套expr := '(' expr ')' => expr | expr_without_short_closure和expr_without_short_closure := [expr_without_short_closure => expr] | yield expr_without_short_closure => expr | expr_without_short_closure 'or' expr | '(' expr ')',同时还允许低优先级左结合运营商如expr_without_short_closure 'or' expr?
目前LALR(1)bison语法的结构如下(呈现实际语法文件的自包含部分,简化一点):
%left ','
%left T_LOGICAL_OR /* or */
%right T_YIELD
%right T_DOUBLE_ARROW /* => */
%left '+'
expr: /* entry point as well */
expr_without_short_closure %prec ',' { $$ = $1; }
| expr_with_short_closure { $$ = $1; }
;
expr_with_short_closure:
short_closure
| T_YIELD expr_without_short_closure …Run Code Online (Sandbox Code Playgroud)