对言语的深入了解:言语就是有语法或许说文法所规矩的
文法能够说是由一系列规矩组成的
每个规矩都有两部分:(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
参考资料
1.The language of languages(Grammar: The language of languages (BNF, EBNF, ABNF and more) (might.net))