我有一个应用程序,我已经有一种语法的解析器,我需要为另一个目的添加第二个不同的语法.
是否有可能有多个?
如果是这样,你如何获得另一个切入点?
谢谢
大卫艾伦芬奇
有谁知道Python的FLEX或LEX规范文件存在于何处?例如,这是ANSI C编程语言的lex规范:http://www.quut.com/c/ANSI-C-grammar-l-1998.html
仅供参考,我正在尝试将代码突出显示到Cocoa应用程序中.正则表达式不会这样做,因为我也希望语法解析折叠代码并识别块.
我想在yacc的main函数中解析我给解析器的字符串.我知道这可以通过使用来完成,yy_scan_string但我不知道如何使用它.我搜索了网页和手册页,但我仍然不清楚.请帮我.
我正在尝试遵循Appel的"ML中的现代编译器实现",并且正在使用Ocamllex编写词法分析器.
规范要求词法分析器在转换转义序列后返回字符串.以下代码摘自ocamllex输入文件:
rule tiger = parse
...
| '"'
{ let buffer = Buffer.create 1 in
STRING (stringl buffer lexbuf)
}
and stringl buffer = parse
| '"' { Buffer.contents buffer }
| "\\t" { Buffer.add_char buffer '\t'; stringl buffer lexbuf }
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
| "\\n" { Buffer.add_char buffer '\n'; stringl buffer lexbuf }
| '\\' '"' { Buffer.add_char buffer '"'; stringl buffer lexbuf }
| '\\' '\\' …Run Code Online (Sandbox Code Playgroud) 我希望能够使用flex/bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的带括号的)列表.
一些例如可解析的列表:
等等
我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(在提供有效列表时我得到语法错误).关于我如何设置它的任何建议?
cList : ELEMENT
{
...
}
| cList COMMA ELEMENT
{
...
}
;
topLevelList : LPAREN cList RPAREN
{
...
}
| cList
{
...
}
;
Run Code Online (Sandbox Code Playgroud) 我们刚刚开始使用flex为项目构建词法分析器,但是我们无法弄清楚如何让它工作.我复制教程中给出的示例代码,并尝试以tut文件作为参数运行flex ++,但每次只收到一个错误.例如
输入文件(calc.l)
%name Scanner
%define IOSTREAM
DIGIT [0-9]
DIGIT1 [1-9]
%%
"+" { cout << "operator <" << yytext[0] << ">" << endl; }
"-" { cout << "operator <" << yytext[0] << ">" << endl; }
"=" { cout << "operator <" << yytext[0] << ">" << endl; }
{DIGIT1}{DIGIT}* { cout << " number <" << yytext << ">" << endl; }
. { cout << " UNKNOWN <" << yytext[0] << ">" << endl; } …Run Code Online (Sandbox Code Playgroud) 我正在尝试生成一个编译器,所以我可以在之后传递一个.c文件.
我从http://www.quut.com/c/ANSI-C-grammar-y.html下载了YACC和LEX语法,并将它们命名为clexyacc.l和clexyacc.y
在终端上生成它时我做了:
yacc -d clexyacc.y
lex clexyacc.l
Run Code Online (Sandbox Code Playgroud)
一切都很好.当我继续到最后一部分时,我得到了一些错误.
最后一部分是:cc lex.yy.c y.tab.c -oclexyacc.exe
但我得到这些错误:
Run Code Online (Sandbox Code Playgroud)y.tab.c:2261:16: warning: implicit declaration of function 'yylex' is invalid in C99 [-Wimplicit-function-declaration] yychar = YYLEX; ^ y.tab.c:1617:16: note: expanded from macro 'YYLEX' # define YYLEX yylex () ^ y.tab.c:2379:7: warning: implicit declaration of function 'yyerror' is invalid in C99 [-Wimplicit-function-declaration] yyerror (YY_("syntax error")); ^ clexyacc.y:530:6: error: conflicting types for 'yyerror' void yyerror(const char *s) ^ y.tab.c:2379:7: note: previous implicit declaration is here yyerror (YY_("syntax …
在Mathematica中,注释以#(*结尾开头,*)注释可以嵌套.我目前使用JFlex扫描注释的方法包含以下代码
%xstate IN_COMMENT
"(*" { yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}
<IN_COMMENT> {
"(*" {yypushstate(IN_COMMENT); return MathematicaElementTypes.COMMENT;}
[^\*\)\(]* {return MathematicaElementTypes.COMMENT;}
"*)" {yypopstate(); return MathematicaElementTypes.COMMENT;}
[\*\)\(] {return MathematicaElementTypes.COMMENT;}
. {return MathematicaElementTypes.BAD_CHARACTER;}
}
Run Code Online (Sandbox Code Playgroud)
方法yypushstate和yypopstate定义为
private final LinkedList<Integer> states = new LinkedList();
private void yypushstate(int state) {
states.addFirst(yystate());
yybegin(state);
}
private void yypopstate() {
final int state = states.removeFirst();
yybegin(state);
}
Run Code Online (Sandbox Code Playgroud)
让我有机会跟踪我正在处理多少嵌套级别的评论.
不幸的是,这导致COMMENT一个注释的几个标记,因为我必须匹配嵌套的注释开始和注释结束.
问:是否有可能与JFlex的使用其API使用类似的方法yypushback或advance()等,以在整个注释范围恰好返回一个道理,即使评论嵌套?
我在这里看ANSI C语法.
此页面包含许多用于ANSI C的Lex/Flex中的正则表达式.
在理解字符串文字的正则表达式时遇到问题.
他们提到正则表达为 \"(\\.|[^\\"])*\"
据我所知,\"这用于双引号,\\用于转义字符,.用于任何字符,除了escape character和*为零或多次.
[^\\"]暗示字符除外\,".
因此,在我看来,正则表达应该是\"(\\.)*\".
你能给出一些正则表达式失败的字符串吗?
要么
他们为什么用过[^\\"]?
我有一个像这样的 lex 文件
%{
#include "y.tab.h"
%}
%%
"print" {return print;}
"exit" {return exit_command;}
[a-zA-Z] {yylval.id = atoi(yytext); return identifier;}
[0-9]+ {yylval.num = atoi(yytext);} return number;}
[ \t\n] ;
[-+=;] {return yytext[0];}
. {ECHO; yyerror("unexpected charater");}
%%
int yywrap(void){return 1;}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行 lex filename.l 时出现
以下错误
filename.l:16: EOF encountered inside an action
Run Code Online (Sandbox Code Playgroud)
任何人都可以看到任何错误