yacc文件中union的目的是什么?它是否与flex文件中的yylval直接相关?如果你不使用yylval,那么你不需要使用union?
我一直在使用lex/yacc,现在我正在尝试切换到ANTLR.主要关注的是ANTLR是一个LL(*)解析器,与yacc不同,它是LALR.我习惯于自下而上思考,我不知道LL语法的优点是什么.人们说LL语法现在更容易理解,更受欢迎.但似乎LR解析器更强大,例如LL解析器无法处理左递归,尽管似乎有一些解决方法.
那么问题是LL语法比LALR有什么优势?如果有人能给我一些例子,我会很感激.有用文章的链接也很棒.
感谢您的帮助!
(我认为这是一个很好的资源:LL解析器对LR解析器有什么优势?但是对于一些例子它会更好.)
我的目标是像Python一样解析字符串.
问题:如何编写lex以支持以下内容:
"string..."'string...'"""multi line string \n \n end"""'''multi line string \n \n end'''一些代码:
states = (
('string', 'exclusive'),
)
# Strings
def t_begin_string(self, t):
r'(\'|(\'{3})|\"|(\"{3}))'
t.lexer.push_state('string')
def t_string_end(self, t):
r'(\'|(\'{3})|\"|(\"{3}))'
t.lexer.pop_state()
def t_string_newline(self, t):
r'\n'
t.lexer.lineno += 1
def t_string_error(self, t):
print("Illegal character in string '%s'" % t.value[0])
t.lexer.skip(1)
我目前的想法是创建4个独特的状态,将匹配4个不同的字符串案例,但我想知道是否有更好的方法.
谢谢你的帮助!
我希望我yylex()解析一个字符串而不是文件或标准输入.如何使用Solaris提供的Lex和Yacc?
可能重复:
我在哪里可以找到ECMAscript/Actionscript/Javascript的yacc gammar
我正在尝试为Yacc找到JavaScript的语法文件(最好是Jay,但是因为Jay是Yacc克隆我应该没问题,因为我需要在.NET上实现它).
我已经找到了答案,但我没有得到任何快速回复的简单例子.
我想使用g ++编译flex/bison扫描器+解析器,因为我想使用C++类来创建AST和类似的东西.
通过互联网搜索我发现了一些漏洞,所有人都说只需要在lex文件中使用extern"C"来声明一些函数原型.
所以我的shady.y文件是
%{
#include <stdio.h>
#include "opcodes.h"
#include "utils.h"
void yyerror(const char *s)
{
fprintf(stderr, "error: %s\n", s);
}
int counter = 0;
extern "C"
{
int yyparse(void);
int yylex(void);
int yywrap()
{
return 1;
}
}
%}
%token INTEGER FLOAT
%token T_SEMICOL T_COMMA T_LPAR T_RPAR T_GRID T_LSPAR T_RSPAR
%token EOL
%token T_MOV T_NOP
%%
... GRAMMAR OMITTED ...
%%
main(int argc, char **argv)
{
yyparse();
}
Run Code Online (Sandbox Code Playgroud)
而shady.l文件是
%{
#include "shady.tab.h"
%}
%%
"MOV"|"mov" { return T_MOV; …Run Code Online (Sandbox Code Playgroud) 有没有人知道lex/yacc格式语法的在线存储库?我正在寻找一种Java语法来制作一个快速的源代码转换器.
谢谢!
编辑:我最好是寻找lex/yacc因为我想使用fslex/fsyacc尽可能少的语法重写.
我正在尝试在语法中使用保留字:
reserved = {
'if' : 'IF',
'then' : 'THEN',
'else' : 'ELSE',
'while' : 'WHILE',
}
tokens = [
'DEPT_CODE',
'COURSE_NUMBER',
'OR_CONJ',
'ID',
] + list(reserved.values())
t_DEPT_CODE = r'[A-Z]{2,}'
t_COURSE_NUMBER = r'[0-9]{4}'
t_OR_CONJ = r'or'
t_ignore = ' \t'
def t_ID(t):
r'[a-zA-Z_][a-zA-Z_0-9]*'
if t.value in reserved.values():
t.type = reserved[t.value]
return t
return None
Run Code Online (Sandbox Code Playgroud)
但是,t_ID规则以某种方式吞下DEPT_CODE和OR_CONJ.我怎么能绕过这个?我希望那两个人比保留的词更优先.