所以我有一个家庭作业,我花了两个多小时试图找出为什么这个语法在LL解析器上不能工作:
<A> → a <B>
<A> → a b <C>
<B> → b d <D>
<C> → d <E>
<D> → m n
<E> → x y
有人能给我指个方向吗?我知道LL可能会出错的一种方式是,如果它陷入了无限循环,而我不相信它会在这里发生。
谢谢
我有一个日志文件中的日期,格式如下:"dMMyyHHmmss“。
由于我想抛出一个异常,如果找到的格式不是那样的,所以我使用DateTime.ParseExact。问题是,我得到了一个包含以下消息的FormatException:
“'String”.“未被识别为有效的DateTime。
效仿的代码是:
var format = "dMMyyHHmmss";
var date = new DateTime(2018, 1, 1, 1, 1, 1);
var strDate = date.ToString(format);
date = DateTime
所以我有一个with语句的简单例子。它在Python3.8和3.9中工作:
class Foo:
def __enter__(self, *args):
print("enter")
def __exit__(self, *args):
print("exit")
with Foo() as f, Foo() as b:
print("Foo")
产出(如预期):
enter
enter
Foo
exit
exit
但是,如果添加像这样的括号,它只适用于Python3.9:
class
下面的语法上下文是免费的吗?我的印象是,当解析器不需要解释已经解析的内容时,语法是上下文自由的。使用下面的语法,这是不必要的,然而,我的同事确信它是上下文敏感的,而不是越少。
问题是,如果不知道X在Y还是Z内,就无法确定X的哪一个选项需要匹配。
X: ( "a" | "a" "b" )
Y: X "b" "c"
Z: X "d"
我相信每一个读过它的人都熟悉悬空的其他模糊。因此,我将跳过解释。我在一本编译器的书(龙书)上找到了一种不含糊的语法,表示IF和ELSE。这就是了。
stmt->matched_stmt | open_stmt
matched_stmt->if exp then matched_stmt else matched_stmt | other
open_stmt->if exp then stmt | if exp then matched_stmt else open_stmt
问题是:
打开_ stmt -> if exp,则stmt\如果exp,则matched_st
我遇到的一个问题是,C必须是上下文敏感的,不能用一个前瞻性标记来解析。例如
int main1;
int main() {}
这是我能想到的最简单的例子,在这个例子中,函数定义和变量声明都以相同的令牌类型开头。您必须一直向前看,才能确定要解析什么。
我的问题是,这是如何完成的?词法分析器是否有一些技巧来实现前瞻性,并发出区分两者的不可见标记?现代分析有许多前瞻性的标志吗?
有人能解释一下为什么这个YAML无效吗?
playing_song_artist: Playing song, {{ song_name }} by {{ artist }}
playing_playlist: {{ action }} playlist {{ playlist_name }}
第一行很好,但我不知道第二行有什么问题.
expected <block end>, but found '<scalar>'
in "<string>", line 3, column 32:
playing_playl
如果有下面的html块:
chunk = '<p>BLA bla bla html... <div>Copyright 2014 NPR</div></p>'
当我做以下事情时:
from bs4 import BeautifulSoup
soup = BeautifulSoup(chunk)
这个大块变成了这样:
>>> soup
<html><body><p>BLA bla bla html... </p><div>Copyright 2014 So
我试着写一些简单的规则,然后我就明白了
rule: field1 field2; //ambiguity between nsf1 and nsf2 even if I use lookahead k=4
field1: nsf1 | whatever1...;
field2: nsf2 | whatever2...;
nsf1: 'N' 'S' 'F' '1'; //meaning: no such field 1
nsf2: 'N' 'S' 'F' '2';
我正在为C++的LALR解析器生成器寻找最好的解决方案,它将允许我生成真正好的错误消息。我真的讨厌MySQL生成的语法错误,我想把解析器放在里面,用一个"lint“检查器来代替它,这个检查器可以告诉我更多信息,而不仅仅是
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a from users' at line