我曾经认为C++是"怪异"的一个与所有与歧义<和>,而是试图实现一个解析器我想我找到打破一个例子之后几乎每一个使用的语言<和>泛型类型:
f(g<h, i>(j));
Run Code Online (Sandbox Code Playgroud)
这可以在语法上解释为泛型方法call(g),也可以解释为给出f两次比较的结果.
这些语言(特别是Java,我认为应该是LALR(1) - 可解决的?)如何克服这种语法模糊性?
我无法想象任何非hacky/context-free方式来解决这个问题,我对这种语言如何无上下文感到困惑,更不用说LALR(1)-parsable ......
(值得注意的是,即使是GLR解析器也无法为此语句返回单个解析而没有上下文!!)
我正在通过NLTK书,我似乎无法做一些似乎是建立一个体面语法的自然的第一步.
我的目标是为特定的文本语料库构建语法.
(初步问题:我是否应该尝试从头开始语法或者我应该从预定义的语法开始?如果我应该从另一个语法开始,这对于英语开始是一个好的?)
假设我有以下简单的语法:
simple_grammar = nltk.parse_cfg("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP
VP -> V NP | VP PP
Det -> 'a' | 'A'
N -> 'car' | 'door'
V -> 'has'
P -> 'in' | 'for'
""");
Run Code Online (Sandbox Code Playgroud)
这个语法可以解析一个非常简单的句子,例如:
parser = nltk.ChartParser(simple_grammar)
trees = parser.nbest_parse("A car has a door")
Run Code Online (Sandbox Code Playgroud)
现在我想扩展这个语法来处理其他名词和动词的句子.如何在不用语法手动定义语法的情况下将这些名词和动词添加到我的语法中?
例如,假设我希望能够解析句子"汽车有轮子".我知道提供的标记器可以神奇地找出哪些单词是动词/名词等等.我怎样才能使用标记器的输出来告诉语法"轮子"是名词?
有没有一个地方我可以找到Backus-Naur Form或BNF语法的流行语言?每当我进行搜索时,我都不会出现太多,但我认为它们必须在某个地方发布.我最感兴趣的是看到一个Objective-C和MySQL.
如何为要从头设计的新编程语言(命令式编程语言)定义语法(无上下文).
换句话说:当您想从头开始创建新的编程语言时,如何继续.
compiler-construction grammar programming-languages context-free-grammar
我是一名C和C++程序员,试图开始使用Objective-C.但是,我真的很困惑,因为语言和标准库的标准文档显然完全没有.我可以理解,没有ISO标准,但根本没有参考文件?怎么没有人似乎非常担心这种状况呢?(不可否认,谷歌很难做到这一点,因为"参考","文档"和"标准"都是超载的术语.所以我可能错过了一些关键的东西.)
这个问题接近于问同样的问题:我在哪里可以找到解释Objective-C如何实现的文档,并且提供的唯一答案是"阅读Apple发布的这个源代码,这与几年前的实现非常接近, 也许".
这个页面:http://clang.llvm.org/docs/ObjectiveCLiterals.html包含了Objective-C的正式语法片段,但具有讽刺意味的是,它描述了Clang刚刚关闭并添加的功能.并没有其他人支持.这里有另一种语法:http://www.omnigroup.com/mailman/archive/macosx-dev/2001-March/022979.html但它已经超过10年了.
将问题缩小到最低限度:我想知道"Object"保证提供哪些方法,以及每种方法的行为是什么.对于其他语言,此类信息通常由以下内容提供:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html
是否有一种简单的方法来确定语法是LL(1),LR(0),SLR(1)......只是从查看语法而不进行任何复杂的分析?
例如:要确定BNF语法是否为LL(1),您必须计算First和Follow集 - 在某些情况下这可能很耗时.
有谁知道如何更快地做到这一点?真的很感激任何帮助!
我正在使用解析器 - 组合器库在Scala中编写一个简单的函数式编程语言.
语法在此处指定:https://github.com/hejfelix/Frase/blob/master/src/main/scala/it/vigtig/lambda/ParserLike.scala
有一件事我无法通过实现来解决:如何将语法定义与转换为AST节点分开?
直接在解析器源中使用接近人类可读的语法真的很酷,特别是考虑到我是项目ATM上唯一的程序员,它可以作为文档.
如何分离语法和AST特定代码?