由买买提看人间百态

topics

全部话题 - 话题: yacc
1 2 3 4 下页 末页 (共4页)
g*********s
发帖数: 1782
1
【 以下文字转载自 Programming 讨论区 】
发信人: gandjmitbbs (Nothing), 信区: Programming
标 题: yacc/bison的调试和分析工具?
发信站: BBS 未名空间站 (Tue May 27 17:42:05 2008)
有个lex/yacc写的文本分析器,现在需要更改一个词法单位string的实现,基本想法是
把返回值从strdup(yytext)改成yytext,用shallow copy来减少malloc/free操作频率
,提高运行效率。
但是更改这个词法单位后引发了链锁反应,所有涉及这个词法单位的yacc状态都要相应
地修改。手工跟踪了一下,非常多。一个一个改,容易错也容易漏。
有没有什么yacc/bison的调试和分析工具,能静态分析,告知有哪些状态需要修改,这
样可以按图索骥?
另外定义了YYDEBUG,也定义了int yydebug=1,调试时报告的状态转换和都是编码,60
,51等,报告的token只有名称,比如string,没有yytext的具体内容。能直接打出状
态名称,还有当前处理的token内容吗?
g*********s
发帖数: 1782
2
来自主题: Programming版 - yacc/bison的调试和分析工具?
有个lex/yacc写的文本分析器,现在需要更改一个词法单位string的实现,基本想法是
把返回值从strdup(yytext)改成yytext,用shallow copy来减少malloc/free操作频率
,提高运行效率。
但是更改这个词法单位后引发了链锁反应,所有涉及这个词法单位的yacc状态都要相应
地修改。手工跟踪了一下,非常多。一个一个改,容易错也容易漏。
有没有什么yacc/bison的调试和分析工具,能静态分析,告知有哪些状态需要修改,这
样可以按图索骥?
另外定义了YYDEBUG,也定义了int yydebug=1,调试时报告的状态转换和都是编码,60
,51等,报告的token只有名称,比如string,没有yytext的具体内容。能直接打出状
态名称,还有当前处理的token内容吗?
更进一步,有比lex/yacc更快的C++ based parser工具吗?ANTLR的C++实现似乎还在进
行中。
谢谢指教!
h*********s
发帖数: 14
3
Hi,
I am running solaris 9 on ultra 10 and the system crashes when I try to use
yacc.
If I type " yacc test.y", the system reports " /usr/ccs/bin/yacc : I/O error".
I can hear the noise from the disk after I issue this command. It then takes a
little bit while (~ 30 sec ) before the whole system gets frozen (keyboard,
mouse, screen ). I can only reboot. During that little while before the system
gets frozen, if you issue any command like "ls", the system gives you "bus
error".
I used yacc pretty
I**********s
发帖数: 441
4
【 以下文字转载自 Programming 讨论区 】
发信人: Ilikebeatles (kaka), 信区: Programming
标 题: YACC tables (yyact, yypact, yypgo ...) 的问题
发信站: BBS 未名空间站 (Fri Oct 20 06:17:16 2006)
我在写一个特殊版本的YACC,现在需要把parsing machine放到y.tab.c的yyact, yypact
, yypgo, yyexca ...里. 哪位高手知道在YACC产生的y.tab.c里这些tables是怎么定义
的吗? 谢谢.
I**********s
发帖数: 441
5
【 以下文字转载自 Programming 讨论区 】
发信人: Ilikebeatles (kaka), 信区: Programming
标 题: YACC tables (yyact, yypact, yypgo ...) 的问题
发信站: BBS 未名空间站 (Fri Oct 20 06:17:16 2006)
我在写一个特殊版本的YACC,现在需要把parsing machine放到y.tab.c的yyact, yypact
, yypgo, yyexca ...里. 哪位高手知道在YACC产生的y.tab.c里这些tables是怎么定义
的吗? 谢谢.
y***a
发帖数: 840
6
来自主题: CS版 - yacc 求助
我一个国内朋友问的。我一点印象都没有了, 又没有多少时间。就跑来求助。
哪位能给给一个大致的样板程序,我们也好照猫画虎
1. 利用语法产生工具YACC(Yacc:Yet Another
Compiler-Compiler),实现指令ADD的语法分析(假定语法分析器已经提供);
2. 输出正确指令的编号,或输出出错的信息;
3. 指令ADD的语法格式见下面资料:
句型:
(1) ADD rd, rs, rt
(2) ADD dst, *+ARm(disp1), *+ARn(disp2)
(3) ADD dst, ARm(IR0), rt
(4) ADD dst, *+ARm(disp), Imm
(5) ADD dst, rs, ARm(IR0)
(6) ADD dst, rs, *+ARm(disp)
(7) ADD dst, ARm(IR0), ARn(IR1)
注:
rs: 寄存器 (通用寄存器r0--r31)
rt: 寄存器 (通用寄存器r0--r31)
rd: 寄存器 (通用寄存器r0--r31)
d
I**********s
发帖数: 441
7
来自主题: Programming版 - 谁知道如何调试yacc程序?
http://www.cs.uic.edu/~spopuri/cparser.html is for bison, not yacc.
There is a new yacc/bison compatible LR(1) parser generator available:
http://compilers.iecc.com/comparch/article/08-02-019
f*****p
发帖数: 235
8
来自主题: CS版 - yacc 求助
Let him/her google a simple tutorial about yacc.
r*********r
发帖数: 3195
9
来自主题: Programming版 - 谁知道如何调试yacc程序?
i found the following article most useful in terms of de-mystifying yacc:
http://www.cs.uic.edu/~spopuri/cparser.html
t****t
发帖数: 6806
10
来自主题: Programming版 - yacc/bison的调试和分析工具?
not sure about automatic tracing. and i think the yacc itself doesn't have
the solution. you can use valgrind on the generated program, though.
about yydebug, refer to "info bison", section "Tracing". there's an example
there.

60
c*****t
发帖数: 1879
11
来自主题: Programming版 - yacc/bison的调试和分析工具?
yytext can change when doing input. Thus, you would have to make a copy
of the current token string with strdup.
yacc++ is a well known commercial parser generator for C++. Just google
it.

60
l**b
发帖数: 457
12
来自主题: Programming版 - lex/yacc如何reset buffer?
去年还在用lex\yacc,感觉有点老了,你的问题我无解,不过你如果真的很不爽,可以
看看其他replacement,我后来就改用antlr了,我记忆里面应该也可以生成c/c++的
code,而且有个eclipse的plugin,挺不错的。大牛们不要鄙视我。
t**r
发帖数: 3428
13
作paser,lexer就用antlr把,别折腾yacc,bison了 累
s*******2
发帖数: 499
14
没有朋友懂yacc的,我有一个bug,始终不知道怎么解决,真诚请教。
我有一个问题,我在运行程序以后出现:
compl.l: In function `yylex':
compl.l:75: warning: assignment makes integer from pointer without a cast
/tmp/ccKAECtZ.o(.text+0x1466): In function `main':
/tmp/ccovPdqh.o(.text+0x1fd): first defined here
/usr/bin/ld: Warning: size of symbol `main' changed from 40 in /tmp/ccovPdqh
.o to 596 in /tmp/ccKAECtZ.o
/tmp/ccKAECtZ.o(.text+0x2a8): In function `yylex':
collect2: ld returned 1 exit status
这种情况是哪里出了错,我该怎么样修改呢?
十分感谢。
c*****t
发帖数: 1879
15
难道你不会看 error message ?写的很清楚嘛:

^^^^^^^^^^^^^^^^^^^^^^^^^^^^
说你有两个 main 。估计是你的 lex/yacc 里面自动生成一个,就跟你的 main
冲突了。
ccovPdqh
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
你有用到 warning 的 function ,但是你并没有 define 。
t******n
发帖数: 2939
16
☆─────────────────────────────────────☆
l63 (l63) 于 (Thu May 23 00:34:22 2013, 美东) 提到:
假设素数只有有限个, 记为 p_1,p_2,...,p_k
考察 N = p_1*p_2*...*p_k + 1
可知: 对于任意i = 1,2,3,...,k, p_i 不能整除 N
由素数的定义:
a是素数 <=> a是大于1的自然数, 且a不被任何小于a的素数整除
可知: N是素数
这与素数只有p_1,p_2,...,p_k矛盾.
故假设不成立.
所以素数有无穷多个.
☆─────────────────────────────────────☆
l63 (l63) 于 (Thu May 23 00:37:03 2013, 美东) 提到:
在承认素数的这个等价定义 (即 a是素数 <=> a是大于1的自然数, 且a不被任何小于a
的素数整除) 的前提下, 居然有人会认为这个证明是错的, 或者是不完备的.
我实在不能理解.
求问一下大家, 是不是有的人的脑子天生有缺陷, 根本怎么教都不会明白... 阅读全帖
S*A
发帖数: 7142
17
来自主题: Programming版 - 最高大上的 atoi
Lex 还行,但是Lex 很简单,自己手写也没有多少。
YACC 做编译器有很多限制,最大的问题是出错的恢复。
例如编程少打个‘;’, 然后编译器就彻底晕菜了。
很不容易跳过这个缺少的‘;’从下一句开始继续编译。
关键在于那个状态转换图是机器自动生成的,里面的过程
人是不参与的,恢复到上个可以继续的状态必须要手工
干预。这个状态图没有直观理解。这就是为什么老的 gcc
有时给出特别莫名其妙的错误信息。
LLVM 就完全没有用 YACC, gcc 以前用 YACC, 后来
也改用手动写了。
Perl 是用 YACC 的,当年我还仔细看过,得出的结论是
那个 YACC 完全是摆设。Perl 的隐含规则特别多,在不同
的 scope 里面可以干不同的事情。Perl 的YACC 里面最关键
的部分是对这些编译状态的维护,这些完全是在 YACC 以外
的。等到喂给 YACC 的时候已经完全确定下面可以发生什么。
YACC 就是走个过场而已,让你觉得 Perl 还有个语法树,其
实是没有的。这也是为什么只有 Perl 可以完全解释 Perl 的
语法。
YACC 基本上除了玩具编译项目不太值得严肃... 阅读全帖
t*******r
发帖数: 22634
18
973 楼是写成 yacc 的文法分析器的概念的。所以不能用通常的计算概念,
计算出素数集合。而是这样计算的(理论上的虚拟 yacc 机)。
虚拟 Yacc 机器首先读入你定义的文法。
然后虚拟 Yacc 机器读入你的输入(在这个实例中就是读入一个任意的 set)。
虚拟 Yacc 机器读入输入的 set 以后,按照前面读入的你定义的文法进行
shift-reduce。
如果 shift-reduce 成功,说明你的输入符合你定义的文法,该虚拟 yacc
机返回 true。如果不能 reduce 成功,返回 false。
在这个例子里,true 就是输入的 set 是 set_of_smallest_n_primes。
false 就不是。
这样,该虚拟 Yacc 机能做到你扔 it 任意一个 set,虚拟 yacc 机返回
该 set 是不是 set_of_smallest_n_primes。
即该虚拟 yacc 机能产生 set_of_primes(你扔给 it 所有自然数集合
的排列组合。。。),当然,慢的要死。。。但理论虚拟机哪个不是慢的要死
的。。。
是不是被我蒙晕了?
t*******r
发帖数: 22634
19
这个简单的 Yacc 左递归,俺翻成下面这个 C伪码 程序。不过翻成 C伪码后不能直接
写 token,俺大脑当人肉yacc编译器,所以对表达正则文法而言,远远不如 yacc
直观。(实际上我是看着 yacc 代码写的这段 C 代码
但是 yacc 只能搞 LR 文法,不少 problem 的正则表述不能用 LR 文法
表达,所以码工就的写 C++ 的 tree/graph 算法。。。实际上 Yacc 除了
编译器领域之外,用得不多,但是 yacc 对正则文法、符号文法的概念比较有好处。
bool is_list_of_primes(list_of_primes)
{
// yacc primitives reduce condition
if (list_of_primes.size() == 1) {
if (list_of_primes == "2")
return true;
else if (list_of_primes == "1")
return false;
else
return f... 阅读全帖
t******n
发帖数: 2939
20
来自主题: WaterWorld版 - [合集] 素数的数学递归定义的问题
☆─────────────────────────────────────☆
xiongyp (dreamrain) 于 (Fri May 24 08:41:56 2013, 美东) 提到:
我们假设不知道什么叫素数,我们对正整数集合进行如下的定义来定义素数。(这是从
链接上取下来的,也是I63的定义)
(1) 1不是素数 (base case)
(2) a是素数当且仅当a不能被任何小于它的素数整除。
我曾经多次指出,这个定义在用素数定义素数,是不正确的。但看到很多的反驳如下。
1不是素数, 我们考察2,发现小于2的素数集合为空集,于是2为素数。以此再往下递归
,得出所有素数的定义。我想昨天深入讨论此内容的人,都不会反对我的总结吧。关于
"小于2的素数集合为空集"推出"2为素数",因我的不慎,还做出过郑重道歉。
好,我们仿造这种递归定义,来定义偶数。
我们假设不知道什么叫偶数,我们对非负整数集合进行如下的定义来定义偶数。
(1) 0不是偶数 (base case)
(2) a是偶数当且仅当a与任何小于它的偶数之差为2的倍数。
我从base case开始。0不是偶数。我们考察... 阅读全帖
t*******r
发帖数: 22634
21
这个代码当然没法 work,我不是说 “伪 yacc” 不是真 yacc 么?
但是真 yacc 就可以 work,你要做到下面两点:
(1)所有的东东,不是 operand 就是 operator。最最基本的 operand
要定义成 token 样的东东。
(2)写成 LR 文法。
那样 Yacc 就可以 shift-reduce 跑得欢乐。。。你可以拼命扔随机的 set 给
yacc,yacc 很欢乐得 shift-reduce,最后告诉你是不是
set-of-smallest_n_primes (return value is "true" or "false").
t*******r
发帖数: 22634
22
好!俺用码工式正面平推法,依据质数的递归定义,证明质数无限性。
首先见 1001 楼,俺用“yacc/c伪码式”正则语法写了质数的递归定义。
该楼在此:
http://www.mitbbs.com/article/WaterWorld/2034385_0.html
这里我写个 C function 来证明,其中的 “list_of_primes” 实际意思
跟 1001 楼 yacc 里意思一样;是指从 2 开始的前 N 个连续质数序列,
按升序排列。(反正正则文法怎么取名问题都不大,内在不对头的话,那个 yacc
必然 reduce 失败。)
// c 伪码 function
list_type grow_primes(list_of_primes)
{
a = 求list里所有数的乘积(list_of_primes);
for (int i = max(list_of_primes) + 1; i < a; i++)
if ( i 不能被list里所有数整除(list_of_primes))
return ( list_of_primes lis... 阅读全帖
l*3
发帖数: 2279
23
不太懂, 没学过 "符号文法" 相关的课.
你就用普通汉语表述一下代码的工作就行.
或者你用伪代码写C的递归也可以, 我可以看懂.
关键是你用了一个叫"yacc伪代码" 的东西, 我并不清楚yacc伪代码和普通汉语 (或者
普通英语) 有什么关系, 也不清楚其形式. 不过C的常见伪代码我是可以看懂的.
-----
具体来说是这样的: 你说一段代码是用 "yacc伪代码" 写的, 因为我不懂 "yacc伪代码
", 所以我不懂哪些地方是 "伪" 的, 于是我无法区分哪些地方该按照 "代码风格" 理
解, 哪些地方按照 "普通语言风格" 理解.
简要来说, "yacc伪代码" 在我这里不是一个 "良定义" 的东西, 我的大脑没法精确处
理了.
-------
我码完如上废话后, 你的后续回复我已看到, 静候C伪代码.
H**********y
发帖数: 7928
24
来自主题: Immigration版 - [合集] 485 被 REF (请 laoda555看一看)
☆─────────────────────────────────────☆
GMAx (GMAx) 于 (Mon Feb 28 20:58:08 2011, 美东) 提到:
今天收到485 的REF,IO 要求补充两个材料。 第一个是皮试的结果。 我当时找的中国
医生, 告诉了她以前的皮试是阳性的。 她就没有做皮试,直接上了X-RAY. 结果,IO
要求补做皮试。 第二个REF 是关于疫苗。 医生只看了我出国时和在美读书时打的疫苗
,就觉得够了。 结果,IO 要求补打VARICELLA 的疫苗。 我对这个有疑惑。我打过了
TD (3针), MMR(2针),Hepatitis B。
我想问一下大家都打了什么疫苗? 大家(特别请laoda555)补充一下,我就一次去打完了。 这也算是为后
来的朋友做了LIST. IO要求30天内补材料, 大家帮帮,快给弄个LIST.
下面是485 TIMELINE:
RD 10/12
ND 11/03
FD 12/10
EAD 1/14
AP 1/18
485 REF 2/23
☆───────────────────────────────... 阅读全帖
b*********r
发帖数: 7139
25
☆─────────────────────────────────────☆
lookforward (dadu) 于 (Thu Nov 3 16:37:13 2011, 美东) 提到:
是不是我要在月底之前递上485就安全了?
还是必须等到绿卡或者EAD卡下来才安全?
我该怎么办?
☆─────────────────────────────────────☆
cmdline (ongoing) 于 (Thu Nov 3 16:39:58 2011, 美东) 提到:
不懂,帮顶
☆─────────────────────────────────────☆
iq350 (iq350) 于 (Thu Nov 3 16:41:50 2011, 美东) 提到:
快交485
☆─────────────────────────────────────☆
kathylee (茗茗) 于 (Thu Nov 3 16:42:59 2011, 美东) 提到:
i am in the same boat with you. just sent i485... 阅读全帖
t*******r
发帖数: 22634
26
我说了上面写的是伪装 “伪 yacc”,也就是伪码,只是表达想法,不是真正
能执行的。
当然,正因为是表达一个想法,所以没有固定的标准,也可能误解。
我现在有点忙,晚上我有时间可以给写个 Yacc + C++ STL 的真代码。(当然
我没时间去编译 test)。这样就不会有误解。
但是 yacc 不能用你所说的方式解释。因为 yacc 是 LALR parser,parse 的
是 LR 文法描述,其过程是 shift / reduce。没有变量赋值的概念。你必须
能理解 LR 文法描述。
t*******r
发帖数: 22634
27
楼主首贴里面的逻辑很牛逼,但伊还是引用了素数的递归定义。
现在的问题是,素数的递归定义引起混淆和争论。为了平息争论,所以想用某种
formal system 的 notation 来精确定义一下素数的递归定义。
当然,你说的对,LR grammar 的确用词不精确,LR grammar 不定义语义。
用 yacc 还是精确点。
所以也就是用 yacc 来定义一下楼主首贴证明里面所引用的“素数的递归定义”。
当然,其实不限于 yacc。任何 formal system 的 notation 方式都可以。
只不过素数的递归定义比较简单,用 yacc 就可以定义。

CFL
S*A
发帖数: 7142
28
来自主题: SanFrancisco版 - 我对Google的ex CEO Eric Schmidt一点评价

?)
In Coders at Work, Ken Thompson talks to Peter Seibel about yacc and lex:
Seibel: And are there development tools that just make you happy to
program?
Thompson: I love yacc. I just love yacc. It just does exactly what you
want done. Its complement, lex, is horrible. It does nothing you want done.
Seibel: Do you use it anyway or do you write your lexers by hand?
Thompson: I write my lexers by hand. Much easier.
t*******r
发帖数: 22634
29
让俺用 “伪 Yacc” 写一个:
“a是素数 <=> a是大于1的自然数, 且a不被任何小于a的素数整除”
“伪 Yacc” 的东东就是类似于:
::=
func()
operator
func()
::= 2
但是,如果把 “小于 a” 改成 “不等于 a”,这玩意儿好像写不出 “伪 Yacc”。
。。
t*******r
发帖数: 22634
30
Yacc 没有函数的概念,都是 list of tokens,按语法进行 shift->reduce.
最后 reduce 成功与否。
里面写的 divisor 算子,在 yacc 实现里面,就是求取模(mod)一下。如果 mod
结果不为零(不能整除),直接要求 yacc 不管三七二十一直接弹出 syntax
error,reduce fail。un_divisor 算子反过来。。。
t*******r
发帖数: 22634
31
我去改一下汉语。
这个语法的左递归比较简单,我可以用 C伪码 递归函数直接写。但是可能比 Yacc
更不直观,更不好理解。毕竟 Yacc 直接把语法写在字面上,C 递归把语法隐含
在递归里。。。
我们不是在讨论素数递归正则语法么?Yacc 直接把 token 写在字面上啊。
t*******r
发帖数: 22634
32
Yacc 只收 LR 文法,还只收字符串,大部分地方不好用。
如果 Yacc 能收抽象的 graph,或者实在不成收 C++STL 的 container
class 啥的也成。这样就不限于 LR 文法。
不过这样牛逼的 超级yacc 编译器,谁来写?
13
t*******r
发帖数: 22634
33
我这么说:
第一:这个高楼是现代数学跟古典数学的冲突。你看看我花了多少时间,
大部分人不一定花我这么多时间。
第二:如果按照码工所使用的现代集合论硅谷实用版,你的证明的确到“可知”
那步就断了。因为 formal logic 到那一步,写不出来。写不出来的
原因是因为 “可知” 是基于那句自然语言 “如果素数是有限的”。而那句
在 formal logic(比如我写的 yacc 伪码),无法表述。
(yacc 伪码里,如何放这句自然语言 “如果素数是有限的,所以。。。”
进去? 你如何创建一个 token,来代表 “如果素数是有限的”?)
第三:我觉得绝大多数码工,思维习惯是基于现代数学的。比如:
如果让码工在 job interview 的时候快速写一个实用素数序列发生器,
估计绝大部分码工都会让素数序列发生器保持已经产生的完整的前N个素数
序列在内存里,然后根据其产生下一个素数,不断添加那个序列。一直到
满足尺寸要求。。。
你如果看我的程序,差别只是我把已经产生的完整前N个素数保持在参数里
而不是内存里。那个差别主要是为了讨论的目的,满足能在 LR文法的
yacc概念虚拟机上跑程序... 阅读全帖
t*******r
发帖数: 22634
34
yacc 只能搞 LR parser,你没错。我这个问题用 yacc 搞成,不等于
其他的问题都用 yacc 搞。。。就好比会写中文不等于只会写中文。。。
当然,我灌水时通常天马行空乱用术语,我主要是说个意思。当然,这个
也不好,我刚才飞速去 wiki 了一下,其实我说的意思应该是 formal
system(当年的课是不是叫《形式逻辑和自动机》?)。
http://en.wikipedia.org/wiki/Formal_system
t*******r
发帖数: 22634
35
来自主题: WaterWorld版 - 素数的数学递归定义的问题
不用争论啦,看我在另一楼里面用 yacc/c伪码 写的正则语法(formal language)
的素数递归定义,这下就可以对罗素笑而不语啦。。。
link 在下面:
http://www.mitbbs.com/article/WaterWorld/2034385_0.html
我把全文 copy & paste 过来:
=============================================
// yacc 段落 (大致):
list_of_primes : list_of_primes one_natural_number
{ if (! if_and_only_if_divisor($2, $1))
弹出语法错误 ; }
| "2"
{ printf("Reduce 成功!"); }
| "1"
... 阅读全帖
d***a
发帖数: 13752
36
来自主题: Programming版 - 最高大上的 atoi
我觉得yacc还行。很早以前我用yacc写过SQL的parser。
yacc是LALR类型的parser生成器,生成的语法树不太直观,
但运行效率比较好,用于SQL解析还是不错的。
t*******r
发帖数: 22634
37
来自主题: Parenting版 - 教四岁小孩学加法的问题
好吧,我解释一下,当然我时间有限,只能快速解释。
中文和英文的自然语言数字表达,这方面没有官方的说法,但从概念上
讲,可以认为是一种 multiplication & addition system。
具体来说,可以姑且认为
(1) “一二三四 one two three four twelve” 等等这种算成
一类基本 token(基本数字)。
(2)“十 百 万 hundred thousand million” 这种算另一种
token(postfix operator)。
(3)把一个数字里所有东西加起来。
(4)规则,每一级的 postfix operator 从大到小排。。。等等
坑爹的自然语言规则。
其实说白了,你用 Lex Yacc 按照 LR 文法分析器要求,写一个
从自然语言数字到阿拉伯数字的 converter,你就明白,英语和
汉语数字的差别,比 “non-positional notation system”
vs “positional notation system” 的差别,小太多了。
如果不了解 lex yacc 以及 LR 文法,或者 formal ... 阅读全帖
t*******r
发帖数: 22634
38
来自主题: Parenting版 - 说COMMON CORE 是为了少刷题的
或者从实用主义的角度说,如果你一辈子只需要 eyeball 那些 logics,罗素是不是请
你喝茶都无所谓。。。
但如果哪天要用 YACC 或者其他的随便啥,写无二义语法,让机器去对付 logics。那
如果让一个二义性溜过去的话,破 YACC 死机都不知道死在哪里。。。当然,你也可以
写二十倍的行数,还漫天都是谁的 bug 在飞。。。
其实咋理解数系统都无所谓,将来用个计算器一按就完事了。。。但如果数系统的逻辑
都搞不清,那将来马工理论就只能靠无节操刷题加死记了。。。其实这样也能拿高分的
,只是这样的人生有点小累,有点小无趣。。。
t******l
发帖数: 10908
39
这个观点有点意思。
如果用语言学的比方,就好比过多闪卡型 syntax / semantic (语法/语意),对
pragmatics (上下文语境) 反而产生负面影响。
不过另一个社会学原因,可能是老军医把 “弱智测试” 给简单外延成 “智商测试”
,在社会学方面的负面指导意义,所产生的直接后果。具体而言:
老军医的 “弱智测试” 特别强调 context-free,也就是上下文无关文法。但图灵说
,尼玛上下文无关文法,在马工界就是一个 lex/yacc 就完事了。要是 lex/yacc 都能
发 paper 的话,那 Turing Test 的 paper 是不是要大伙儿出来跪见上帝了?

:现在的孩子睡觉之前都会让爸爸妈妈讲故事,而现在的各类绘本、音像制品实在是太
多了,父母随便买一本回来就能给孩子讲好几天。但问题的关键是,大多数父母是在给
孩子指着图“读”故事,而不是用心给孩子讲故事。
l******t
发帖数: 2243
40
来自主题: Immigration版 - eb1b+pp approved, no rfe, and 485 concerns
congrats. according to TSC's website, the processing time is July 24, 2010?

发信人: yacc (yacc), 信区: Immigration
标 题: eb1b+pp approved, no rfe, and 485 concerns
发信站: BBS 未名空间站 (Wed Mar 9 16:11:11 2011, 美东)
First of all, Thank you all !
Background:
phd:2009 US, now postdoc, cs
paper 12, citation > 30, review > 30, all in English, few first authored but
almost all in alphabetical order due to the area convention. Have some
conference talks and a patent pending and one paper used in a course. Four
... 阅读全帖
t*******r
发帖数: 22634
41
这个俺改改不就好了么。。。俺不过就是省了一步搞了个提速优化么。。。
让俺用 “伪 Yacc” 再写一个:
“a是素数 <=> a是大于1的自然数, 且a不被任何小于a的素数整除”
“伪 Yacc” 的东东就是类似于:
::=
(func()
operator
func())
&& (func() > 1)
&& (func(set_of_smallest_n_primes>) == true)
::=
done :-)

"
t*******r
发帖数: 22634
42
我先写个提纲,用 yacc 语法:
// yacc 段落:
list_of_primes : list_of_primes one_natural_number
{ if (! func_if_an_only_if_divisor($2, $1))
error ; }
| "2"
;
// func_if_an_only_if_divisor() 晚上用 C++ 写。。。
l*3
发帖数: 2279
43
你汉语用法有似乎一些有歧义, 我看不懂.
比如 "整除" 这个词, "a整除b" 和 "b被a整除" 表示的是b除以a的余数是0, 即存在
整数r 使得b=a*r, 你好像一些地方是反过来写的.
另外, 你那个yacc段落, 我实在不知道符号是什么意思.
你也可以用C语言来写吧: reduce本身可以当做一个函数, 你注明其作用就行了.
总之你的目的不就是任给一个自然数的子集, 然后用代码判断它是不是素数集吗?
难道yacc伪代码能写, c伪代码就做不到?
t*******r
发帖数: 22634
44
我不知道你看懂了没有。这里的关键点在于符号文法/正则文法。
或者我就用赋值和中学代数来说。
赋值,其实是用符号代替具体的数。其数学基础是中学代数的第一步:用符号代替
具体的数。
中学代数的第二步,就是符号运算。(多项式化简,等等)。
其实任何符号运算都基于某种符号文法,但中学代数通常不能称为符号文法,只能
称为符号运算,其原因是该符号文法是固定的,不会因为你换一道题做,而改变
一种符号文法。
到大学本科学微积分,其实是另一种符号运算(即所说的“牛顿/莱布尼兹微积分符号
体系”)。虽然换了一种基于的符号文法,但微积分还只能称为符号运算,而不是符号
文法,理由同上。
到码工的正则文法课/LR文法课,这时出现了符号文法。每道题的符号规则一般都不同,
每个 yacc 程序定义了不同的符号规则。所谓 reduce,是看着符号规则(比如
yacc 代码),进行符号运算。
t*******r
发帖数: 22634
45
如果是 C伪码版,{3} 的 size 是 1,又不等于集合 {2},返回 false。
如果是 yacc伪码版,reduce 成 primitive token “one_natural_number”,
但不是 "2",出语法错。(我 伪yacc 没写全,伪码就是个意思,省掉不写的默认
action 是语法错)。
这个是 expected behavior,应为 list_of_primes 的实际定义是从 2
开始的前 N 个连续素数。{3} 不符合这个定义。
t*******r
发帖数: 22634
46
你这个 C 程序写的更精炼,直接符合质数递归定义。
我那个是从 yacc 直接翻译过来,目的是跟 yacc 一致。
其实是为了保持 token / set 的概念写的。
t*******r
发帖数: 22634
47
我这个定义只用“找到”。。。这个总可以理解吧。。。
至于前面用的 “生成” 的意思,是指按照 yacc伪码 写的 formal logic,
反向 recur up 找出大一号的集合。(yacc 运行是 reduce / recur down)。
这样保证能被 reduce,所以找出来的是 valid 的集合。
经典集合论的无穷集,俺估计早就忘得一干二净了。。。我对无穷的最最最最近的记忆,
是本科微积分课。。。你要让我再去找欧几里德,我直接晕菜了。。。
不过这个交流也不错,码工们的学习都是渐变的。俺没意识到古典数学思想和现代数学
思想差别还是蛮大的。看来俺要让俺的娃在可能的情况下提早向现代数学迈步。。。
l*****8
发帖数: 16949
48
只能说你想太多了。
没错,程序设计语言本身确实是形式语言的一种。但是你说的yacc(一种语法分析器)
和它能够支持的LR grammar,是属于context-free languages的一种,这种只是语法分
析的一部分,而不涉及语义分析。简单的说,这种语法分析可以理解 a+b*c是解释成a+
(b*c)还是(a+b)*c.但具体a,b,c,有没有定义,可不可以合法的用在这里(比如如果b是
字符串类型),加法和乘法如何定义,这个不是context-free grammar可以处理的(因
为完整的程序设计语言属于context-sensitive language)。
回到这个问题,关于素数定义显然不仅仅是语法问题,而更多的是语义问题,因此不是
yacc,context-free grammar之类能说清的。
h*******e
发帖数: 225
49
yacc/bison is just a source-to-source compiler. add necessary "#include"s in
the declaration section in the .yacc file.
h*******e
发帖数: 225
50
xxx.yacc -> Yacc -> xxx.cc | xxx.h
So its basically just including another .h file.
1 2 3 4 下页 末页 (共4页)