作为宠物项目,我想尝试实现我自己设计的基本语言,可以用作网络脚本语言.将C++程序作为Apache CGI运行是微不足道的,因此真正的工作在于如何解析包含非代码(HTML/CSS标记)和服务器端代码的输入文件.
在我的本科编译课程中,我们使用Flex和Bison为简单语言生成扫描程序和解析器.我们得到了一份语法副本,并编写了一个解析器,将简单语言翻译成虚拟机的简单程序集.flex扫描器将输入标记化,并将标记传递给Bison解析器.
我和我想做的事情之间的区别在于,像PHP一样,这种语言可以有纯HTML标记,脚本语言散布如下:
<p>Hello,
<? echo "World ?>
</p>
Run Code Online (Sandbox Code Playgroud)
假设解析输入文件效率如下,我是不正确的:
基本上,第一个扫描程序仅区分Markup(直接返回到未修改的浏览器)和代码,后者传递给第二个扫描程序,后者又将代码标记化并将标记传递给解析器.
如果这不是一个可靠的设计模式,PHP等语言如何有效地处理扫描输入和解析代码?
对于C或C++,哪种词法分析器/解析器生成器是最好的(最容易使用,最快)?我现在正在使用flex和bison,但是bison只处理LALR(1)语法.我解析语言并不真的需要无限的前瞻,但无限的先行将使解析了很多更加容易.我应该试试Antlr吗?可可/ R?Elkhound?别的什么?
Emacs在Flex和Bison中对自动缩进的处理很差.事实上,它似乎不支持flex模式.那么,emacs用户如何应对这些?我喜欢VIm,但我不想切换,因为我在Emacs中更快更舒服.
几个月前,我为Bison设立了第三方elisp模块,但当它的缩进破坏时,它永远不会被修复.简而言之,这是一个糟糕的黑客.
或者有没有办法可以关闭.l和.y文件的自动缩进(所以按下会做一个缩进)?我如何仅为emacs更改此elisp设置?
一个简洁的elisp指南也非常有用.如果我有正确的文档,我不介意花几天时间编写自己的flex和bison模式.
有没有办法为堆管理指定我自己的allocator/deallocator函数而不是malloc()/ free()用于bison中的纯推送解析器?
我希望能够使用flex/bison解析规则解析非空的,一个或多个元素,逗号分隔(以及可选的带括号的)列表.
一些例如可解析的列表:
等等
我使用以下规则来解析列表(最终结果是解析元素'顶级列表'),但它们在解析时似乎没有给出所需的结果(在提供有效列表时我得到语法错误).关于我如何设置它的任何建议?
cList : ELEMENT
{
...
}
| cList COMMA ELEMENT
{
...
}
;
topLevelList : LPAREN cList RPAREN
{
...
}
| cList
{
...
}
;
Run Code Online (Sandbox Code Playgroud) 有没有人知道是否有一些教程和/或网上使用GNU Bison和Java的例子.我在网上搜索过.但我没有找到任何东西.我试图实现一个例子,但我无法编译它(因为我也需要一个词法分析器).这是我的例子:
%{
static void main(String[] args) {
yyparse();
}
%}
%union {
int number;
char operator;
}
%language "Java"
%token<number> NUMBER
%token<operator> OPERATOR
%type <number> exp
%left OPERATOR
%%
input
: /* Empty string */
| exp { System.out.print("Result >> " + $1); }
;
exp
: NUMBER
| exp OPERATOR exp {
switch($2) {
case '+': $$ = $1 + $3; break;
case '-': $$ = $1 - $3; break;
case '*': $$ = $1 * $3; break; …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用flex和bison在我的项目中为文件结构生成解析器代码.主要编程语言是C++,项目主要是并行运行的OO设计.
我听说flex并且bison生成的解析器是C代码,它们不是重新检测的.谷歌搜索,我发现flex++和bisonc++.不幸的是,没有简单的入门教程.大多数例子都是基于bison/flex.有些人以某种方式将bison/flex解析器集成到他们的C++代码中.他们应该"狡猾"......
文档,flex++并bisonc++没有帮助我和.教程和示例,它们都从stdin获取输入并在stdout上打印一些消息.
我在解析器中需要这些功能:
std::string或std::stringstream或空终止char*.我感到很困惑.我应该使用flex++/bisonc++或flex/bison?如何做到这一点,满足上述条件?
我目前正在尝试使用Flex + Bison编写一个小编译器,但我在错误处理方面有点迷失,特别是如何使所有东西都融合在一起.为了激发讨论,请考虑我用于字符串文字的以下词法分析器片段:
["] { BEGIN(STRING_LITERAL); init_string_buffer(); }
<STRING_LITERAL>{
\\\\ { add_char_to_buffer('\\'); }
\\\" { add_char_to_buffer('\"'); }
\\. { /*Invalid escape. How do I treat this error?*/ }
["] { BEGIN(INITIAL); yylval = get_string_buffer(); return TK_STRING; }
}
Run Code Online (Sandbox Code Playgroud)
如何处理无效转义的情况?现在我只是打印一条错误消息并打电话exit但我更愿意继续前进并在可能的情况下检测每个文件多个错误.
我的问题:
我已宣布这样的优先顺序bison:
%left '+' '-'
%left '*' '/'
Run Code Online (Sandbox Code Playgroud)
算术的递归规则:
exp: exp binary_op exp { .. }
| literal_exp { .. }
| ID { .. }
binary_op: '+' { .. }
| '-' { .. }
| '*' { .. }
| '/' { .. }
Run Code Online (Sandbox Code Playgroud)
我有一个算术表达式: 10 * 3 + 5
我的程序计算总和,它是80!我仍然不知道为什么优先权不起作用.
我有一个学校项目,我们需要使用flex和bison.我想使用C++,这样我就可以访问我编写的STL和我自己的类.我们获得了以下Makefile:
CC = gcc
CFLAGS = -g
OBJs = parse.tab.o symtab.o attr.o lex.yy.o
default: parser
parser: ${OBJs}
${CC} ${CFLAGS} ${OBJs} -o parser -lfl
lex.yy.c: scan.l parse.tab.h attr.h
flex -i scan.l
parse.tab.c: parse.y attr.h symtab.h
bison -dv parse.y
parse.tab.h: parse.tab.c
clean:
rm -f parser lex.yy.c *.o parse.tab.[ch] parse.output
depend:
makedepend -I. *.c
Run Code Online (Sandbox Code Playgroud)
scan.l和parse.y有一些初始的flex/bison东西来生成扫描器和解析器.我需要将自己的东西添加到这些文件中.symtab.{h,c}应该是符号表的实现.attr.{h,c}用于某些属性魔法.我想制作symtab.ca .cc文件,以便我可以使用STL.我还有其他原因想要使用C++.
我尝试使用parse.ypp文件,以便生成.cpp文件.但问题是我没有得到正确的.h文件.我将Makefile更改为如下所示:
CC = g++ # Change gcc to g++
CFLAGS = -g
OBJs = lex.yy.o parse.tab.o symtab.o attr.o
default: lex.yy.c parser # added lex.yy.c so I could …Run Code Online (Sandbox Code Playgroud)