我想要一个实用程序,我可以给一段文本(在文本框中)并尝试解析器语法(通过编辑类似的BNF)和令牌结构,同时我可以看到解析树的外观(如果它是无法使用我当前的语法解析文本,我会看到它停止的位置).
关键词是互动.我可以使用flex和bison来做到这一点,但我不得不重新创建我的词法分析器和解析器.
那里有这样的东西吗?我还没找到.理想情况下它应该在Linux中工作并且是免费的,如果这不是一个选项,它仍然是有意义的.
假设你有这个伪代码
do_something();
function do_something(){
print "I am saying hello.";
}
Run Code Online (Sandbox Code Playgroud)
为什么有些编程语言需要调用do_something()才能显示在函数声明下面才能运行代码?
comparison scope programming-languages language-comparisons lexer
词法分子如何解决这种模糊性?
/*/*/
Run Code Online (Sandbox Code Playgroud)
它是如何不只是说,哦,是的,这是一个多行评论的开始,接着是另一个多行评论.
一个贪婪的词法分析器不会只返回以下令牌吗?
我正在为CSS编写一个shift-reduce解析器,然而这个简单的注释事情就是我的方式.如果您不想获得更多背景信息,可以阅读此问题.
很抱歉首先将其删除.我打算在这个表单中添加CSS语言的扩展,/* @ func ( args, ... ) */但我不想混淆一个理解CSS但不是我的扩展注释的编辑器.这就是为什么词法分析者不能忽视评论.
我想使用 bison/flex创建简单的 xml 解析器。我不需要验证、注释、参数,只需要<tag>value</tag>,其中值可以是数字、字符串或其他<tag>value</tag>。
例如:
<div>
<mul>
<num>20</num>
<add>
<num>1</num>
<num>5</num>
</add>
</mul>
<id>test</id>
</div>
Run Code Online (Sandbox Code Playgroud)
如果有帮助,我知道可能出现的所有标签的名称。我知道给定标签可以容纳多少个子标签。是否可以创建可以执行以下操作的野牛解析器:
- new Tag("num", 1) // tag1
- new Tag("num", 5) // tag2
- new Tag("add", tag1, tag2) // tag3
- new Tag("num", 20) // tag4
- new Tag("mul", tag4, tag3)
...
- root = top_tag
Run Code Online (Sandbox Code Playgroud)
标签和子标签数量:
你能帮我语法来创建上面给出的 …
我正在使用CL-Lex实现词法分析器(作为CL-YACC的输入),我的语言有几个关键词,如"let"和"in".然而,虽然词法分析器识别出这样的关键词,但它确实太多了.当它找到诸如"init"之类的单词时,它将第一个标记返回为IN,而它应该为"init"字返回一个"CONST"标记.
这是词法分析器的简单版本:
(define-string-lexer lexer
(...)
("in" (return (values :in $@)))
("[a-z]([a-z]|[A-Z]|\_)" (return (values :const $@))))
Run Code Online (Sandbox Code Playgroud)
如何强制词法分析器完全读取整个单词,直到出现一些空格?
我有一个关于DFA最小化的问题.所以我使用了众所周知的技术将正则表达式转换为NFA,然后使用goto/closure算法从中构造DFA.现在问题是如何最小化它?我在这里看过关于它的文章:http://www.youtube.com/watch? v = T9Z66NF5YRk ,我仍然无法理解.什么是DFA最小化?这只是合并IDENTICAL状态(状态在相同的字符上进入相同的状态)还是不同的东西?
所以,我开始使用以下语法:
%digit = '0'..'9'
%letter = 'a'..'z' | 'A'..'Z'
%exponent = ("e" | "E") ("+" | "-")? digit+
T_INT = digit+
T_FLOAT = T_INT exponent
T_IDENTIFIER = (letter | "$" | "_") (letter | "$" | "_" | digit)*
Run Code Online (Sandbox Code Playgroud)
最终得到以下DFA(表示为JSON):
{
"START": [{
"type": "range",
"from": 36,
"to": 36,
"shift": "1"
}, {
"type": "range",
"from": 48,
"to": 57,
"shift": "2"
}, {
"type": "range",
"from": 65,
"to": 90,
"shift": "1"
}, …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个有趣的词法分析器.我已经实现了一个基本的正则表达式匹配器(首先将模式转换为NFA,然后转换为DFA).现在我对如何继续我一无所知.
我的词法分析者将会获取一系列令牌及其相应的正则表达式.用于创建词法分析器的一般算法是什么?
我想过(或)所有的正则表达式,但后来我无法确定哪个特定的令牌匹配.即使我扩展我的正则表达式模块以返回匹配成功时匹配的模式,我如何在匹配器中实现先行?
Antlr 的词法分析器支持 Kleene 闭包 ( *) 和正 Kleene 闭包 ( +),分别指示字符在非正/正时间出现的次数。Antlr 的词法分析器是否有一个结构来支持某个字符的一系列出现,就像正则表达式一样,比如'a' {8,16}?
以下非常简单的示例语法不像我预期的那样(根本没有).
Declaration : 'VAR';
Letter: ('A'..'Z');
message : Declaration Letter+;
Run Code Online (Sandbox Code Playgroud)
我所期望的结果是,任何字母序列都会作为单个字母而形成,并且序列"VAR"将被作为单个标记.
当我查看ANTLRWorks interperter时,我看到以下结果:
VARA解析message -> "VAR", "A"(预期)VARVA不解析(MismatchedTokenException(-1!= 5).词法分析器命中第二个VA并尝试标记Declaration.预期:message -> "VAR", "V", "A"VARVPP解析message -> "VAR", "V", "P", "P"(预期)VARVALL解析message -> "VAR", "VALL".我想帮助理解这种行为,并建议我如何解决这个问题.
特别:
VA为"声明",如果后跟一个字母?V?开头的所有字符串来执行此操作?我正在做论文,我必须将源代码解析并标记为单个函数.对于每个函数,我想提取类型的名称,称为函数名称和类型转换.铿锵声是这种工作的正确工具吗?如果是,我该怎么做?
下面是一个简单的C函数.粗体是我想要的提取项目:
static char func1(unsigned int a, struct foo *b)
{
int c = 0;
struct bar *d;
if (a == 0) {
d = func2((int) a);
} else {
c = func3((struct bar *) b);
}
return c;
}
lexer ×10
antlr ×2
regex ×2
algorithm ×1
antlr3 ×1
bison ×1
bnf ×1
comparison ×1
dfa ×1
flex-lexer ×1
lisp ×1
llvm ×1
llvm-clang ×1
nfa ×1
parsing ×1
preprocessor ×1
scope ×1
xml-parsing ×1