Parsing 嵌套的括号可以在化学式中解析吗?
我试图为简单的化学公式创建一个解析器。也就是说,它们没有物质、电荷或诸如此类的状态。公式中只有表示复合词、数量和括号的字符串 ,以及一些离散数学的基本知识,我希望我能写一个简单的公式来生成公式中每个原子的数量。我已经有了一个包含单括号,但不包含嵌套括号的方法 以下是不带括号的语法结果:Parsing 嵌套的括号可以在化学式中解析吗?,parsing,Parsing,我试图为简单的化学公式创建一个解析器。也就是说,它们没有物质、电荷或诸如此类的状态。公式中只有表示复合词、数量和括号的字符串 ,以及一些离散数学的基本知识,我希望我能写一个简单的公式来生成公式中每个原子的数量。我已经有了一个包含单括号,但不包含嵌套括号的方法 以下是不带括号的语法结果: Compound: Component { Component }; Component: Atom [Quantity] Atom: 'H' | 'He' | 'Li' | 'Be' ... Quantit
Compound: Component { Component };
Component: Atom [Quantity]
Atom: 'H' | 'He' | 'Li' | 'Be' ...
Quantity: Digit { Digit }
Digit: '0' | '1' | ... '9'
被视为可选,如果程序中有测试,则该测试将成为[…]
(要么存在,要么缺失)
是备选方案,if也是。。否则。。否则或开关“测试”,表示输入必须匹配其中一个|
被读取为0或更多的重复,并且在程序中是一个while循环{…}
- 引号之间的字符是字符串中的文字字符。所有其他单词都是规则的名称,对于递归下降解析器来说,最终都是被调用来分解和处理输入的函数的名称
(Fe2(OH)2(H2O)8)2
,或者类似于(Ab(CD2(Ef(G2H)3)(IJ2)4)3)2
因为现在有一部作品我真的不知道如何表达,但这是我最好的尝试:
Parenthetical: Compound { Parenthetical } [Quantity]
因此,基本规则解析任何没有括号的简单化学符号和数量序列 我假设数量定义了在“(“…”)之间的整块东西的数量 因此,
'(“…”)[Quantity]
需要与组件完全相同的内容进行解析,即作为:Atom[Quantity]
所以唯一需要改变的是组件规则;它变成:
成分:原子[数量]|'(“化合物”)'[数量]
在解析组件的代码函数(或过程)中,它将查看下一个字符(标记),如果它是“(”,它将使用它,然后调用负责解析复合词的函数(或过程),然后检查下一个字符(标记)是“”(如果不是,则是语法错误),然后处理可选数量,然后完成
我假设您使用的编程语言支持递归函数(或过程)调用。这种内务管理,通过幕后代码为您的程序完成,将使这个“正常工作”(TM)
或者,您可以用另一种方式解决问题。添加一条新规则,其中说明:
Stuff:Atom |'(“化合物”)”
然后修改规则:
化合物:物质[数量]
然后为Stuff编写一个新函数(或过程),将复合代码更改为只调用Stuff,然后处理可选数量
这样做是为了支持某些解析技术,有很好的技术原因。然而,您使用的是递归下降,而这并不重要
编辑:对于递归体面解析器来说,非常有效的语法类型称为LL(1),这意味着从左到右解析,并创建最左边的派生。当代码和函数调用是控制流时,这是一种“自然”的解析方式。为了找到如何检查语法的理论,LL(1)在web上搜索“解析LL(1)”或“语法跟随集”。嘿,很抱歉这么晚才回复,但我终于回到了这个项目,这真的很有帮助!非常感谢。@Doctorder医生-我很高兴这是有帮助的。谢谢你也接受了答案。我已经忘记了,最近主要从事电子产品。stackexchange,所以我非常困惑!)天啊,这让编写代码变得容易多了。工作起来很有魅力。我非常喜欢这个语法和作品的概念。“它很漂亮!”DoctorOrder-选择编写递归下降解析器,并设计了大部分语法。使用递归下降法使自己更容易。语法和代码之间的关系非常明确。一旦语法正确,代码就会“自行编写”,几乎:-)