Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 嵌套的括号可以在化学式中解析吗?_Parsing - Fatal编程技术网

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-选择编写递归下降解析器,并设计了大部分语法。使用递归下降法使自己更容易。语法和代码之间的关系非常明确。一旦语法正确,代码就会“自行编写”,几乎:-)