对言语的深入了解:言语就是有语法或许说文法所规矩的

文法能够说是由一系列规矩组成的

每个规矩都有两部分:(1) 称号 (2) 称号的扩展。

例如,假如咱们创建一个语法来处理英语文本,咱们可能会添加一个规矩,例如:

名词短语能够扩展为词名词。

从中咱们最终能够推断出“狗”是一个名词短语。

或许,假如咱们描绘一种编程言语,咱们能够添加一个规矩,例如:

表达式能够扩展为扩展表达式

接下来咱们拿bnf举个比方:

expr ::= term { "+" term | "-" term }.
term ::= factor { "*" factor | "/" factor }.
factor ::= "(" expr ")" | const.
const := "1" | "2" | "3".

bnf由四条规矩组成(在bnf中 “能够扩展”被表明为:: =):

rule1.称号:expr

称号的扩展: term { “+” term | “-” term }.(能够了解成一个term或许一个term + term或许 term-term)

这个规矩就是讲一个expr能够生成(变成)一个term 或许 term + term 或许term – term

rule2.称号:term

称号的扩展: factor { “*” factor | “/” factor }..(能够了解成一个factor或许一个factor * factor或许 factor / factor)

这个规矩就是讲一个term能够生成(变成)一个factor或许 factor * factor或许 factor / factor

rule3.称号:factor

称号的扩展: “(” expr “)” | const.

这个规矩就是讲一个factor能够生成(变成)(expr)或许 const (为什么expr要加括号呢?鄙人面的比方中有表现)

rule4.称号:const

称号的扩展:”1″ | “2” | “3”.

这个规矩就是讲一个const能够生成(变成)1或许2或许3

举个详细比方:1*(2+3)

-> expr
-> term
-> factor *  factor
-> const  *  expr
-> const  * (term  + term)
-> const  * (factor + factor)
-> const  * (const + const-> 1    * (2   + 3

有一点要注意就是那个expr的括号,因为考虑到优先级的原因。

你有没有考虑到这些规矩的顺序问题,为什么第一个是加减呢?(我个人觉得是因为一个整式expr比方咱们这个‘1 (2+3)’都能够分解成‘1(2+3)’ + 0,而0能够不表明。要是*/,那么就要多出一个1)

这个bnf解析的进程就是一棵树的构造进程,这棵树就是ast

语法/文法,bnf 够用指南

参考资料

1.The language of languages(Grammar: The language of languages (BNF, EBNF, ABNF and more) (might.net))

2.柯里化的前生今世(三):言语和同像性 (柯里化的前生今世(三):言语和同像性 – 知乎 (zhihu.com))