我需要从给定的C#文件中提取所有字符串文字.#if DEBUG假设所有条件编译常量(例如)都为假,并且可以假定该文件在语法上是正确的.应支持单行("a\u1000b")和逐字(@"x""\y")文字.
首先,我尝试使用正则表达式,但后来意识到我需要在#if指令中正确处理单行和多行注释和逻辑表达式.
所以,在我开始编写自己的C#lexer之前,我想问你现有的解决方案.
我正在尝试编写一种用于编写标记代码的元语言(例如xml和html),它可以直接嵌入到C/C++代码中.这是一个用这种语言编写的简单示例,我称之为WDI(Web开发接口):
/*
* Simple wdi/html sample source code
*/
#include <mySite>
string name = "myName";
string toCapital(string str);
html
{
head {
title { mySiteTitle; }
link(rel="stylesheet", href="style.css");
}
body(id="default") {
// Page content wrapper
div(id="wrapper", class="some_class") {
h1 { "Hello, " + toCapital(name) + "!"; }
// Lists post
ul(id="post_list") {
for(post in posts) {
li { a(href=post.getID()) { post.tilte; } }
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上它是一个修改过的C源代码,具有用户友好的html界面.正如您所看到的,传统的基于标签的样式被类似C的命令所取代,其中的块由花括号分隔.我需要构建一个解释器来将此代码转换为html,然后将其插入到C中,以便可以编译它.C部分保持不变.在wdi源代码内部没有必要使用print,每个return语句都将用于输出(在printf函数中).该程序的输出将是干净的HTML代码.
因此,例如标题1标记将被转换为:
h1 { "Hello, " + toCapital(name) + "!"; }
// …Run Code Online (Sandbox Code Playgroud) 我正在研究为Apex语言编写代码格式化工具的可行性,Java上的Salesforce.com变体,以及基于标记的标记语言perhams VisualForce.
我不知道从哪里开始这个,除了感觉/知道从头开始编写语言解析器可能不是最好的方法.
我对Antlr是什么以及它做了什么有一个相当薄的把握,但从概念上讲,我想象一个人可以"训练"antlr来理解Apex的语法.然后,我可以在数据结构(AST?)中获得代码的结构化版本,然后我可以走,以生成格式正确的代码.
这是正确的概念吗?Antlr是一个可以做到这一点的工具吗?有关此的简要概要的任何链接?我正在寻找投资这几天的任务,而不是几个月,我不确定它是否甚至模糊地实现.
我目前正在学习解析,但我对如何生成AST感到有点困惑.我编写了一个解析器,可以正确地验证表达式是否符合语法(当表达式符合时它是静默的,而当表达式不符合时引发异常).我从哪里开始构建AST?我发现了很多关于构建我的LL(1)解析器的信息,但是很少有人继续构建AST.
我的当前代码(用非常简单的Ruby编写,包括词法分析器和解析器)可以在github上找到:https://gist.github.com/e9d4081b7d3409e30a57
有人能解释我如何从目前的AST到AST吗?
或者,如果您不熟悉Ruby,但知道C,您能告诉我如何在递归下降解析维基百科文章中为C代码构建AST .
请注意,我不想使用像yacc或antlr这样的解析器生成器为我做的工作,我想从头开始做所有事情.
谢谢!
我有兴趣通过实现基于堆栈的编程语言来扩展我对计算机编程的了解.我正在寻找关于从哪里开始的建议,因为我打算让它具有像" pushint 1"这样的函数,它可以将值为1的整数推送到堆栈的顶部,并通过像" L01: jump L01:" 这样的标签来控制流量.
到目前为止,我已经实现了我希望我的语言行为的C#实现(想要链接到它但IDEOne被阻止),但它非常混乱,需要优化.它将输入转换为XML,然后解析它.我的目标是使用较低级别的语言(可能是C/C++),但我的问题是实现一个可以容纳各种数据类型并且没有固定大小的堆栈.
最后我还想实现数组和函数.另外,我认为我需要有一个更好的Lexer,我想知道解析树是否适合这种简单的语言.
任何建议/批评都是受欢迎的,请考虑我仍然是编程的新手(我刚刚完成了AP CompSci I).此外,欢迎链接到基于开源堆栈的语言.
这是一个基本的程序,我想尝试解释/编译(在哪里[this is a comment]):
[Hello World!]
pushchar '\n'
pushstring "Hello World!"
print
[Count to 5 and then count down!]
pushint 1
setlocal 0
L01:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal 0
increment
setlocal 0 [x = x + 1]
pushint 5
getlocal 0
lessthan [x < 5]
iftrue L01
L02:
pushchar '\n'
getlocal 0
print [print x + '\n']
getlocal …Run Code Online (Sandbox Code Playgroud) 我使用ANTLR版本4来创建编译器.第一阶段是Lexer部分.我创建了"CompilerLexer.g4"文件并在其中推出了lexer规则.它工作正常.
CompilerLexer.g4:
lexer grammar CompilerLexer;
INT : 'int' ; //1
FLOAT : 'float' ; //2
BEGIN : 'begin' ; //3
END : 'end' ; //4
To : 'to' ; //5
NEXT : 'next' ; //6
REAL : 'real' ; //7
BOOLEAN : 'bool' ; //8
.
.
.
NOTEQUAL : '!=' ; //46
AND : '&&' ; //47
OR : '||' ; //48
POW : '^' ; //49
ID : [a-zA-Z]+ ; //50
WS
: ' ' -> channel(HIDDEN) //50 …Run Code Online (Sandbox Code Playgroud) 我是编译器构建世界的新手,我想知道直接编码与表驱动词法分析器有什么区别?
如果可能,请使用简单的源代码示例.
谢谢.
编辑:
在" 编译工程"一书中,作者将词法分为三(3)种类型:表驱动,直接编码和手动编码.
无论出于何种原因,我都需要使用mendir和sedlex(utf-8),但是不知道如何使生成的解析器依赖Sedlexing而不是Lexing.有小费吗?
我跑的时候
menhir --infer parser.mly
Run Code Online (Sandbox Code Playgroud)
生成的程序有行Lexing....我可以手动更改它,但必须有另一种方式,不是吗?
我是新手,所以我想知道为什么我需要使用这些指令
%option nounput
%option noinput
Run Code Online (Sandbox Code Playgroud)
是的,我知道否则我会有这些警告:
lex.yy.c:1237:17: warning: ‘yyunput’ defined but not used [-Wunused-function]
static void yyunput (int c, register char * yy_bp )
^
lex.yy.c:1278:16: warning: ‘input’ defined but not used [-Wunused-function]
static int input (void)
^
Run Code Online (Sandbox Code Playgroud)
这些指令在flex中实际上是什么问题?在这种情况下,我将能够使用这些功能(为什么):
static void yyunput (int c, register char * yy_bp );
static int input (void);
Run Code Online (Sandbox Code Playgroud)
有什么用?
对于一个小型编译器项目,我们目前正在为C的子集实现编译器,我们决定使用Haskell和megaparsec.总的来说,我们取得了很好的进展,但仍有一些我们无法正确处理的极端情况.其中之一是反斜杠的处理,然后换行.引用规范:
删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.(§5.1.1.,ISO/IEC9899:201x)
到目前为止,我们提出了两种可能的方法来解决这个问题:
1.)实现一个前期阶段,其中再现初始输入并且每次出现都\\\n被删除.我们在这种方法中看到的最大缺点是我们丢失了我们需要的准确错误位置.
2.)实现一个特殊的char'组合器,其行为类似于char前方的额外角色并且将默默地消耗任何组合\\\n.这会给我们正确的立场.在此不利的是,我们需要更换每一个的occurence char与char'任何解析器,甚至在百万秒差距,提供的像string,integer,whitespace等...
我们很可能不是第一个尝试使用parsec/megaparsec来解析这种语法的人,所以我可以想象有一些更好的方法可以做到这一点.有没有人有想法?
lexer ×10
parsing ×5
c# ×2
antlr ×1
antlr4 ×1
c ×1
flex-lexer ×1
force.com ×1
grammar ×1
haskell ×1
html ×1
interpreter ×1
ll-grammar ×1
megaparsec ×1
menhir ×1
ocaml ×1
parsec ×1
ruby ×1
salesforce ×1
stack-based ×1
table-driven ×1