草庐IT

ruby - 如何手动构建 AST?

我目前正在学习解析,但我对如何生成AST有点困惑。我编写了一个解析器,可以正确验证表达式是否符合语法(当表达式符合时它会保持沉默,否则会引发异常)。我从这里去哪里构建AST?我找到了很多关于构建我的LL(1)解析器的信息,但是关于构建AST的信息却很少。我当前的代码(用非常简单的Ruby编写,包括词法分析器和解析器)可在github上找到:https://gist.github.com/e9d4081b7d3409e30a57有人能解释一下我是如何从目前拥有的东西变成AST的吗?或者,如果您不熟悉Ruby,但知道C,您能告诉我如何为recursivedescentparsing中的C代

javascript - 简单的递归下降解析器?

我正在为一种编译成JS(如果相关的话)的模板语言编写解析器。我从几个简单的正则表达式开始,它们似乎可以工作,但正则表达式非常脆弱,所以我决定改写一个解析器。我首先编写了一个简单的解析器,它通过压入/弹出堆栈来记住状态,但事情一直在升级,直到我手上有了一个递归下降解析器。不久之后,我比较了我以前所有解析方法的性能。递归下降解析器到目前为止是最慢的。我被卡住了:是否值得为一些简单的事情使用递归下降解析器,或者我是否有理由走捷径?我很想走纯正则表达式路线,它非常快(几乎比RD解析器快3倍),但在某种程度上非常hacky和不可维护。我认为性能不是非常重要,因为编译后的模板被缓存了,但是递归下降

javascript - ng-pattern 给出 "Lexer Error"?

作为输入元素的一个属性,我有:ng-pattern="^\d{5}(?:[-\s]\d{4})?$"这个表达式有什么问题?我收到这个错误:LexerError:Unexpectednextcharacteratcolumns0-0[^]inexpression[^\d{5}(?:[-\s]\d{4})?$]. 最佳答案 尝试在^之前和$符号之后添加/。例如ng-pattern="/^\d{5}(?:[-\s]\d{4})?$/"希望对您有所帮助! 关于javascript-ng-patt

html - golang html/template ExecuteTemplate errant byte 它来自哪里?

背景我试图为Go编写一些GZIP中间件,但遇到了一个问题,因为http.DetectContentType()返回的是text/plain而不是text/html所以我追踪到第一个被写入的文本是某种类型或错误的字节,我仍在努力追查。我知道有很多解决方法,比如在执行模板时显式设置ContentType或使用bytes.Buffer并一次写入所有内容,但我真的很想找出导致写入这个单个字节的原因。例子这是一个非常人为的例子,它显示了同样的问题https://play.golang.org/p/SSrWP9jLRq运行时你会看到打印的第一件事是:“LENBYTES:1String:”嫌疑人如示

c# - 嵌套泛型语法歧义 >>

显然,C#很容易受到“>>”词法分析器困境的影响asisC++.这段C#代码非常有效,它编译和运行都很好:varList=newDummy("List");varNullable=newDummy("Nullable");varGuid=newDummy("Guid");varx=List>10;vary=List>.Equals(10,20);您必须为上面的Dummy类重载“>”运算符。但编译器设法猜测,在“x”的情况下,意思是使用List、Nullable和Guid局部变量。在'y'情况下,它突然决定将它们视为众所周知类型的名称。这里有一个更详细的描述和另一个例子:http://m

c# - .NET 中的解析器操作方法

我想了解如何在.NET中构建解析器来处理源文件。例如,也许我可以从学习如何解析SQL、HTML或CSS开始,然后根据结果采取行动,以便能够将它们格式化以提高可读性或类似的东西。我在哪里可以学习如何执行此操作?有没有具体的书可以引用?我需要了解词法分析器/解析器吗?特别适用于.NET平台,因为我对C#很熟悉。 最佳答案 我个人找到了这篇文章,GrammarsandParsingwithC#2.0,关于编写词法分析器/解析器的精彩介绍,以及与C#相关的示例。我写了abriefblogpost不久前关于它,做它赞美。好处是它非常适合完全初

javascript - 如何为 marked.js 编写自定义 InlineLexer 规则?

与Marked我可以在实现过程中轻松覆盖/添加/更改词法分析器规则,这太棒了!例如,我可以强制在哈希符号和文本之间使用空格来制作这样的标题:varlexer=newmarked.Lexer(options);console.log(lexer);lexer.rules.heading=/^\s*(#{1,6})\s+([^\n]+?)*#**(?:\n+|$)/console.log(marked.parser(lexer.lex('#hashtag?'),options));//#hashtag?console.log(marked.parser(lexer.lex('#headin

php - 是否有 Javascript 词法分析器/分词器(在 PHP 中)?

我在Mozilla.org上看到了几个PythonJavascript分词器和一份关于JavascriptLexer的神秘文档,但找不到任何专门用于PHP的Javascript分词器。有吗?谢谢 最佳答案 我对这两者都没有经验,所以我无法告诉你他们做了什么以及他们将代码标记化的细节,但我可以看到两个:JSLint是一个可执行文件,但带有一个PHP接口(interface)-可能对您来说还不够,因为它可能不会将原始标记化发布到调用程序PHPSniffer声称带有一个完整的Javascript分词器,你可以使用它。这看起来最有趣。

php - 我应该使用/编写模板词法分析器吗

我正在使用一段时间前编写的PHP模板引擎。它依靠正则表达式来创建缓存的PHP文件。一些语法示例:{$foo}-regularvariable{$foo.bar}-variablefoothatusesthearraykey'bar'{$foo|uppercase}-modifier'uppercase'thattakes'foo'andappliessomemethodtoit{iteration:users}Hithere{$users.name}{/iteration:users}这个列表还在继续......解析所有这些涉及相当多的令人讨厌的正则表达式。请注意,一个迭代可以在另一个

php - 使用 SUM(a.id=1) 作为 `ìdentifier` 时的学说错误:预期的学说\ORM\查询\Lexer::T_CLOSE_PARENTHESIS,得到 '='

我正在尝试执行包含类似内容的学说SUM(a.id=1)as`1`由于某些原因,它总是给我以下错误:[SyntaxError]line0,col15:Error:ExpectedDoctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS,got'='这是我正在使用的代码$result=$em->getRepository('MyBundle:PlayerAction')->createQueryBuilder('pa')->select(array('SUM(a.id=1)as`1`,SUM(a.id=2)as`2`,SUM(a.id=3)as`3`,p.