Compiler construction 如何使用LEX&YACC检查句子是否完整

Compiler construction 如何使用LEX&YACC检查句子是否完整,compiler-construction,grammar,semantics,yacc,lex,Compiler Construction,Grammar,Semantics,Yacc,Lex,我正在LEX&YACC中设计一个工具来检查用户输入的句子在语法上是否正确。如何检查一个句子的意思是否完整。 我的工具可以识别句子的模式。 对于s+v+o模式 我正在读的书是正确的句子! 但我喝的书与模式相匹配,这不是充分的意思! 如何给出YACC中句子语义检查的规则?您正在尝试使用形式化解析机制解析自然语言 这几乎不起作用,因为自然语言不遵循干净的语法规则。 你需要了解 一旦你通过了原始解析,那么你需要有一个关于世界、事物、事物属性以及事物如何相互作用的巨大知识数据库。这是书本不可饮用的知识来源

我正在LEX&YACC中设计一个工具来检查用户输入的句子在语法上是否正确。如何检查一个句子的意思是否完整。 我的工具可以识别句子的模式。 对于s+v+o模式 我正在读的书是正确的句子! 但我喝的书与模式相匹配,这不是充分的意思!
如何给出YACC中句子语义检查的规则?

您正在尝试使用形式化解析机制解析自然语言

这几乎不起作用,因为自然语言不遵循干净的语法规则。 你需要了解

一旦你通过了原始解析,那么你需要有一个关于世界、事物、事物属性以及事物如何相互作用的巨大知识数据库。这是书本不可饮用的知识来源,用于过滤解析。当然,您可以在YACC语法中添加一点这方面的知识,然后它将处理您的示例,但是您需要大量的时间来处理人们真正说的话,或者合理地说不允许说的话

无色的绿色思想疯狂地睡着了。
玛丽吃了一点羊肉、一点奶酪和一点饮料。

您正在尝试使用正式的解析机制解析自然语言

这几乎不起作用,因为自然语言不遵循干净的语法规则。 你需要了解

一旦你通过了原始解析,那么你需要有一个关于世界、事物、事物属性以及事物如何相互作用的巨大知识数据库。这是书本不可饮用的知识来源,用于过滤解析。当然,您可以在YACC语法中添加一点这方面的知识,然后它将处理您的示例,但是您需要大量的时间来处理人们真正说的话,或者合理地说不允许说的话

无色的绿色思想疯狂地睡着了。
玛丽吃了一点羊肉、一点奶酪和一点饮料。

即使在问题的第一部分:检查句子是否符合语法,也不能使用Yacc。自然语言没有明确的上下文无关语法。所以你在制作一个玩具程序,它能识别有限的句子。好吧,让我们先考虑一下如何让玩具操纵这种意义

简单地建立一个关于动词的数据库,该数据库指示它们采用什么类型的参数,比如编程语言中的函数:该数据库指示什么主体执行该动词,对什么类型的对象,使用什么可能的工具,在什么情况下,等等

狗写了一张有叶子的椅子。我们在我们的小玩具数据库中查找write,发现dog不在可能的主语列表上,尽管动词是及物动词,但chair不是可能的直接宾语,leaf也不是可能的工具

所以我们的程序可以拒绝这个句子并给出一个或多个理由

这与当A是整数而B是字符串时拒绝A+B,或者当func只有两个参数时拒绝funcA、B、C没有多大区别

最好使用一种易于处理符号表示的语言。该任务得益于能够在树结构上进行模式匹配


Lex和Yacc实际上并没有给这类任务带来太多的价值。至少不是生成C代码并与之交互的常规lex和Yacc。

即使在问题的第一部分:检查句子是否符合语法,也不能使用Yacc。自然语言没有明确的上下文无关语法。所以你在制作一个玩具程序,它能识别有限的句子。好吧,让我们先考虑一下如何让玩具操纵这种意义

简单地建立一个关于动词的数据库,该数据库指示它们采用什么类型的参数,比如编程语言中的函数:该数据库指示什么主体执行该动词,对什么类型的对象,使用什么可能的工具,在什么情况下,等等

狗写了一张有叶子的椅子。我们在我们的小玩具数据库中查找write,发现dog不在可能的主语列表上,尽管动词是及物动词,但chair不是可能的直接宾语,leaf也不是可能的工具

所以我们的程序可以拒绝这个句子并给出一个或多个理由

这与当A是整数而B是字符串时拒绝A+B,或者当func只有两个参数时拒绝funcA、B、C没有多大区别

最好使用一种易于处理符号表示的语言。该任务得益于能够在树结构上进行模式匹配

Lex和Yacc实际上并没有给这类任务带来太多的价值。至少不是生成C代码并与之交互的常规lex和Yacc。

IRa Baxter 拥有一个关于世界、事物、事物属性以及事物如何相互作用的知识数据库,你可以在你的YACC语法中添加一点这方面的知识,然后它会处理你的例子,但你需要大量的知识来处理人们真正说的话,或者说,合理地说,不允许说的话

你能举个例子更清楚地说明如何将知识添加到YACC语法中吗

IRa Baxter 拥有一个关于世界、事物、事物属性以及事物如何相互作用的知识数据库,你可以在你的YACC语法中添加一点这方面的知识,然后它会处理你的例子,但你需要大量的知识来处理人们真正说的话,或者说,合理地说,不允许说的话


您能否通过举例说明如何将知识添加到YACC语法中

对于YACC来说,歧义是一个问题,但对于Early或GLR解析器来说,则不是。我担心这一说法可能会带来误解。GLR不是处理歧义语法的方法,而是处理LALR1 Yacc算法功能不够强大的明确语法。GLR无法处理像英语这样没有上下文无关LR语法的语言。由于LALR1只有一个前瞻标记,加上一些压缩解析表的限制,使得无法为某些语法构造工作表,因此它受到限制。即使您有任意的前瞻和未压缩的LR表,也无法解析自然语言;这没用。我认为GLR比你想象的更能经得起考验。它实际上来自NLP社区。真正计算机语言的解析器实际上面对上下文敏感的语言;我们只是选择编写一个上下文无关语法并在原始解析机制之外强制执行上下文敏感部分来处理这个问题。我不明白为什么英语有什么不同。。。您可以编写WLOG一些上下文无关的语法最坏情况:English=word*;那就收集它。问题是原始NLP解析器相对于外部解析器检查处理了多少额外的上下文敏感度。感谢您的建议!它帮助我把事情弄清楚了!模糊性是YACC的问题,但不是Earley或GLR解析器的问题。我担心这句话暴露了可能的误解。GLR不是处理歧义语法的方法,而是处理LALR1 Yacc算法功能不够强大的明确语法。GLR无法处理像英语这样没有上下文无关LR语法的语言。由于LALR1只有一个前瞻标记,加上一些压缩解析表的限制,使得无法为某些语法构造工作表,因此它受到限制。即使您有任意的前瞻和未压缩的LR表,也无法解析自然语言;这没用。我认为GLR比你想象的更能经得起考验。它实际上来自NLP社区。真正计算机语言的解析器实际上面对上下文敏感的语言;我们只是选择编写一个上下文无关语法并在原始解析机制之外强制执行上下文敏感部分来处理这个问题。我不明白为什么英语有什么不同。。。您可以编写WLOG一些上下文无关的语法最坏情况:English=word*;那就收集它。问题是原始NLP解析器相对于外部解析器检查处理了多少额外的上下文敏感度。感谢您的建议!它帮助我把事情弄清楚了!谢谢你的建议!它帮助我把事情弄清楚了!谢谢你的建议!它帮助我把事情弄清楚了!