是否有可能使YACC(或者我是我的MPPG)输出抽象语法树(AST).
我正在阅读的所有内容都表明YACC很容易做到这一点,但是我很难知道你是如何知道何时在树中建立节点的时候.
可能重复:
我在哪里可以找到ECMAscript/Actionscript/Javascript的yacc gammar
我正在尝试为Yacc找到JavaScript的语法文件(最好是Jay,但是因为Jay是Yacc克隆我应该没问题,因为我需要在.NET上实现它).
有没有人知道lex/yacc格式语法的在线存储库?我正在寻找一种Java语法来制作一个快速的源代码转换器.
谢谢!
编辑:我最好是寻找lex/yacc因为我想使用fslex/fsyacc尽可能少的语法重写.
我正在尝试在语法中使用保留字:
reserved = {
'if' : 'IF',
'then' : 'THEN',
'else' : 'ELSE',
'while' : 'WHILE',
}
tokens = [
'DEPT_CODE',
'COURSE_NUMBER',
'OR_CONJ',
'ID',
] + list(reserved.values())
t_DEPT_CODE = r'[A-Z]{2,}'
t_COURSE_NUMBER = r'[0-9]{4}'
t_OR_CONJ = r'or'
t_ignore = ' \t'
def t_ID(t):
r'[a-zA-Z_][a-zA-Z_0-9]*'
if t.value in reserved.values():
t.type = reserved[t.value]
return t
return None
Run Code Online (Sandbox Code Playgroud)
但是,t_ID规则以某种方式吞下DEPT_CODE和OR_CONJ.我怎么能绕过这个?我希望那两个人比保留的词更优先.
大约每年一次,我必须开发或至少设计一个语法和解析器 - 这似乎是我工作生活的一个常数.
每次我面对这个任务,大约一年,我,相当一个lex/yacc(flex/bison resp.)的家伙,考虑或重新考虑普通lex/yacc的替代品,并在经过一些沉思和尝试之后回到普通的lex/yacc.
因为我在应用程序的中心有一个CORBA服务器,我可以用几乎所有语言编写的解析器调用,所以这次我看看
对我来说,带有antlrworks的串联antlr4看起来是最有希望的候选者,但是我还不确定花在进入它上面的时间最终会被摊销.
我必须开发的语法类似于SQL DDL(在结构方面,而不是在主题方面).
为什么任何替代方案都会使我的任务比使用普通lex/yacc更容易?
我一直在帮助我公司内部增加一项二十年的专有语言.它是一种图灵完整的大型语言.将它翻译成另一种语法(如Antlr)不是一种选择(我不能做出决定).
在大多数情况下,扩展语法已经顺利进行.但每隔一段时间我就会得到减少减少或减少减少
在经历了很多痛苦的盯着y.output文件和实验语法重构之后,我通常会到达我想去的地方.有时我不得不做出令人不满意的妥协.
那么,是否有任何工具可以吸收yacc语法,这可以增强浏览,试验和允许调试变更?
如果我添加一个产品,我希望看到的不仅仅是"到处使用的原子生产"(认为标识符)"与规则foo冲突"(是的,有更多的信息,s/r,r/r,比那个,但我认为你得到了我的漂移).除了戴上我的思维帽并试图想象一个符号堆栈和状态机之外,有一些相互影响的暗示会很好.
更新:我想我应该澄清一下.我们使用Berkeley Yacc.我一直在使用最新版本的Bison进行测试.对于输出,我用--report = itemset编译了语法.
我在这篇文章中的目标是寻找外部工具来增强 yacc附带的语法调试工具.今天使用默认设置很痛苦.帮助我找到更好的交互式工具,例如可以与Antlr一起使用的工具.
我以前从未做过Bison或Wisent.
我该如何开始?
我的真正目标是为C#生成一个有效的Wisent/Semantic语法,允许在带有代码完成的emacs中编辑C#,以及所有其他CEDET好东西.(对于那些不知道是谁,野牛之是一个与Emacs口齿不清端口GNU野牛,这是纳入CEDET. 野牛之显然是欧洲野牛.野牛,我把它,是一出戏,对词的派生YACC.而CEDET是Emacs开发工具的集合.所有人都赶上了?我不打算尝试定义emacs.)
Microsoft在语言参考文档中为C#提供了BNF语法,包括所有LINQ扩展.我能够将其转换为成功编译的.wy文件semantic-grammar-create-package.
但编译后的语法并没有"起作用".在某些情况下,语法"查找" enum声明,但不是class声明.为什么?我不知道.我无法识别属性.我发现语法的"调试"并不容易.
我想我会退后一步,尝试为一种简单易懂的语言制作一个明智的语法,这种语言只有几个关键词.只是为了获得一些经验.即便如此,这也是一个挑战.
我已经看过关于语法fw的.info文档,并且很明智,但是......仍然有些东西并没有真正为我澄清,这些东西是如何真正起作用的.
所以
Q1:有关在emacs中调试明智语法的任何提示吗?有没有办法在语法上运行一个"类似lint"的东西来找出是否有未使用的规则,这样的死胡同?如何能够观察解析器的运行情况呢?有这样的吗?
Q2:关于加速野牛/一般情况的任何提示?我正在考虑的是一种工具,可以让我深入了解规则的运作方式.提供一些透明度的东西,而不是"我没有工作"的经验,我现在正在使用Wisent.
问题3:我应该放弃并成为一名有机农民,而不是继续打击这一点吗?
ps:我知道CEDET/semantic的contrib目录中现有的C#语法.这件事有效,但是......它不支持最新的C#规范,包括LINQ,部分类和方法,yield,匿名方法,对象初始化器等等.此外,它主要解析一堆C#代码.它嗅出了类和方法,然后挽救了.即使是foreach循环也没有做得很好.尽管它很好,但我希望看到它更好.我正在尝试做的是使它成为当前的,并且还扩展它以解析更多的C#代码.
我正在尝试根据N1570编写C11的lex/yacc语法.我的大部分语法都是从信息性语法摘要中逐字复制的,但是出现了一些yacc冲突.我设法解决了所有这些问题,除了一个:当'_Atomic'用作类型说明符和用作类型限定符时,似乎存在一些模糊性.
在说明符形式中,_Atomic紧跟着括号,所以我假设它与C的很少使用的语法有关,它允许声明符在括号中,从而允许括号立即跟随限定符.但我的语法已经知道如何区分typedef名称和其他标识符,所以yacc应该知道差异,不应该吗?
我不能为我的生活想到一个实际上是模棱两可的案例.
我怀疑它有帮助,但这是我使用yacc的-v标志时获得的相关状态输出."ATOMIC"显然是我的"_Atomic"的令牌名称
state 23
152 atomic_type_specifier: ATOMIC . '(' type_name ')'
156 type_qualifier: ATOMIC .
'(' shift, and go to state 49
'(' [reduce using rule 156 (type_qualifier)]
$default reduce using rule 156 (type_qualifier)
Run Code Online (Sandbox Code Playgroud)