精华内容
下载资源
问答
  • dharma, 基于生成的上下文无关语法 fuzzer 要求无示例生成单个测试用例。%./dharma.py -grammars grammars/webcrypto.dg生成一个带有多个语法的测试用例。%./dharma.py -grammars gram
  • 上下文无关语法

    千次阅读 2018-01-06 21:34:31
    本博文主要介绍基于巴科斯-诺尔范式的上下文无关语法,以及在计算机编程语言和解析技术上的应用。 引言 编程语言,协议规范,查询语言,文件格式,模式语言,内存布局,形式语言,配置文件,标记语言,格式化...

    本博文主要介绍基于巴科斯-诺尔范式的上下文无关语法,以及在计算机编程语言和解析技术上的应用。

    引言

    编程语言,协议规范,查询语言,文件格式,模式语言,内存布局,形式语言,配置文件,标记语言,格式化语言和元语言构成了我们计算的方式。

    那么,什么构成了语言呢?
    是语法。
    语法是语言的语言。
    在每一种语言的背后,都有一个决定其结构的语法。

    下面我们将要解释语法和语法的常用符号,例如Backus-Naur Form(BNF)(巴科斯-诺尔范式,是由John Backus和Peter Naur首次引入一种形式化符号来描述给定语言的语法),Extended Backus-Naur Form(EBNF,扩展巴科斯-诺尔范式),ABNF(增强巴科斯-诺尔范式)以及常规扩展BNF。

    现在几乎每一位新编程语言书籍的作者都会使用巴科斯范式来定义编程语言的语法规则
    巴科斯-诺尔范式的内容大概是这样的:
    (1) 在双引号中的字"word"代表着这些字符本身。double_quota 用来代表双引号
    (2) 在双引号外的字(有可能是下划线)代表着语法部分
    (3) 尖括号(<>)内包含的为必选项
    (4) 方括号([])内包含的是可选项
    (5) 大括号({})内包含的是可重复0到无数次的项
    (6) 竖线(|)表示在其左右两边任选一项,相当于OR的意思
    (7) ::= 是"被定义为"的意思。

    下面是使用巴科斯范式定义的java语言中的for语句的实例:

    FOR_STATEMENT ::= 
    "for" "(" ( variable_declaration | (expression ";")| ";")
    [ expression ] ";"
    [ expression ]
    ")" statement

    通过本次学习,您将能够识别和解释所有常用的语法符号。

    语法定义一种语言

    在计算机科学中,最常见的语法类型是上下文无关语法,而这些语法将作为本文的重点进行讲解。
    上下文无关语法很丰富,可以用来描述很多(尽管不是全部)语言的递归句法结构,至于上下文无关语法之外的语法我们稍后再讨论。

    上下文无关语法的组件:
    一套规则是语法的核心组成部分。
    每个规则有两个部分:(1)名称(2)名称的扩展

    例如,我们正在创建一个语法来处理英文文本,我们可能会添加一条规则。如:
    名词短语可以扩展为文章名词。
    由此我们可以最终推断出“the dog” 是一个名词短语。

    或者,如果我们正在描述一种编程语言,我们可以添加一个规则。如:
    表达式可能扩展为表达式+表达式
    如果我们将语法作为数学对象来使用,那么我们会把“可能扩展到”改为→
    这样上面的例子就可以写成:
    名词短语→ 文章名词
    表达式→ 表达式+表达式

    举个例子,考虑经典明确的表达式语法:

    expr→term+expr
    expr→term
    term→term∗factor
    term→factor
    factor→(expr)
    factor→const
    const→integer
    
    那么我们如何知道3*7 是一个有效的表达式呢?
    因为:
    expr 可以扩展为term
    进而可以扩展为 term * factor
    进而可以扩展为 factor * facor
    进而可以扩展为 const * factor
    进而可以扩展为 const * const
    进而可以扩展为 3 * const
    进而可以扩展为 3 * 7

    巴科斯-诺尔范式(BNF)符号

    当描述语言时,Backus-Naur范式(BNF)是用于编码语法的正式符号。
    很多编程语言,协议和格式都在其规范中有一个BNF描述。
    Backus-Naur范式的每一条规则都有如下结构:
    name ::= 扩展
    其中::= 表示为“可扩展为”,”可以替换为”
    在一些文本中,名称也被称为非终端符号。

    Backus-Naur范式中的每个名称都被尖括号<>包围,无论它出现在规则的左侧还是右侧。
    扩展是一个包含终端符号和非终端符号的表达式,通过排列逻辑和选择逻辑连接在一起。
    简单的并排表达式表示表达式排序关系。
    终端符号是字面值类似于(”+” 或者”function”)或者字面量类型(如整数)
    |符号表示选择逻辑。

    举个例子说明一下,用BNF表示经典表达式语法如下:

    <expr> ::= <term> "+" <expr>
             |  <term>
     <term> ::= <factor> "*" <term>
             |  <factor>
     <factor> ::= "(" <expr> ")"
               |  <const>
     <const> ::= integer

    自然,我们可以为BNF的规则定义一个语法如下:

    rule —> name ::= expansion
    name —> <identifier>
    expansion —> expansion expansion
    expansion —> expansion | expansion
    expansion —> name
    expansion —> terminal
    
    我们可以使用正则表达式[A-Za-z_0-9]+来定义identifier
    terminal 可以是引号包围的字面量或者是字面量类型(如整数)。

    扩展BNF(EBNF)符号

    扩展Backus-Naur范式是BNF范式的扩展集合。EBNF不能说是BNF的超集,因为EBNF更改了部分规则定义关系。比如::= 改为了=,从非终端规则中删除了尖括号等。
    EBNF范式中更为重要的差异是它扩展了附加操作。

    取反操作
    例如,规则:
     <term> :: = ["-"] <factor>
    允许因素是相反数。

    重复操作
    在EBNF中,{}表示表达式可以重复零次或多次。
    例如,规则:
     <args> :: = <arg> {"," <arg>}
    定义了一个常规的逗号分隔参数列表。

    分组操作
    为了表达优先级,EBNF语法可以使用括号()来明确地定义扩展顺序。
    例如,
     <expr> :: = <term>("+"|"-")<expr>
    定义了一个允许加法和减法的表达式。

    级联操作
    在某些形式的EBNF中,运算符明确表示串联,而不是形式上的并列。

    增强的BNF范式(ABNF)

    协议规范通常使用增强的Backus-Naur范式(BNF)
    ABNF原则上与EBNF相似,只不过其在选择操作,可选操作以及重复操作表达用的符号不同。
    ABNF还提供了精确指定特定字节值的能力,这在协议中非常重要。
    在ABNF中,
    选择符号是/
    选项符号是方括号[]
    重复符号是前缀*
    重复n次或者更多次符号是前缀n*
    重复n到m次符号是前缀n*m
    EBNF的 {expansion}在ABNF中使用*(expansion) 符号表示

    以下是从RFC 5322中获取的日期和时间格式的定义。

    date-time =[ day-of-week "," ] date time [CFWS]
    day-of-week  =([FWS] day-name) / obs-day-of-week
    day-name  ="Mon" / "Tue" / "Wed" / "Thu" /"Fri" / "Sat" / "Sun"
    date=day month year
    day =([FWS] 1*2DIGIT FWS) / obs-day
    month  ="Jan" / "Feb" / "Mar" / "Apr" /"May" / "Jun" / "Jul" / "Aug" /"Sep" / "Oct" / "Nov" / "Dec"
    year=(FWS 4*DIGIT FWS) / obs-year
    time=time-of-day zone
    time-of-day  =hour ":" minute [ ":" second ]
    hour=2DIGIT / obs-hour
    minute =2DIGIT / obs-minute
    second =2DIGIT / obs-second
    zone=(FWS ( "+" / "-" ) 4DIGIT) / obs-zone

    常规扩展BNF范式

    在语法中类似正则表达式的操作是很常见的。
    例如,pyhon的语法规范使用它们。
    在这些语法中:
    postfix *表示"重复0次以上"
    后缀+表示"重复1次以上"
    后缀?意味着"0或1次"

    Python中浮点文字的定义是一个很好的结合几个符号的例子:

    floatnumber   ::=  pointfloat | exponentfloat
    pointfloat    ::=  [intpart] fraction | intpart "."
    exponentfloat ::=  (intpart | pointfloat) exponent
    intpart       ::=  digit+
    fraction      ::=  "." digit+
    exponent      ::=  ("e" | "E") ["+" | "-"] digit+
    
    它没有在名称周围使用的尖括号(如许多EBNF符号和ABNF),但使用:: =(如BNF)。 它将常规操作(如非空重复的+)与EBNF约定(如[])混合在一起进行选择。
    整个Python语言的语法使用略有不同(但仍然是常规)的符号。

    上下文无关语法之外的世界

    以上我们讨论的都是上下文无关语法,虽然正则表达式在属于上下文无关语法:你可以将任何正则表达式重写为一个语法来表达这个正则表达式想要表达的内容,但是相反,并不是每个语法都可以转换成一个等价的正则表达式。

    为了超越上下文无关语法的表达能力,需要在语法中允许一定程度的上下文敏感度。
    上下文敏感性意味着终端符号可能出现在规则的左侧:
    考虑下面的设计语法:
    <top> :: = <a>")"
    <a> :: ="("<exp>
    "("<exp>")":: = 7
    <top>可以展开成<a>")";
    进而可能扩展为"("<exp>")";
    进而可能扩展为7。

    尽管设计上这种改变看起来很小,但是它使得语法等同于和它们描述的语言相关的图灵机。
    通过限制规则使左侧的符号比右侧的所有扩展符号严格少,上下文相关的语法相当于(可确定的)线性有界自动机。

    尽管有些语言是上下文敏感的,但是上下文敏感的语法很少用于描述计算机语言。
    例如,由于C处理标识符和类型的方式的需要,C稍微有点上下文敏感性,但是这种上下文敏感性是通过特殊的约定来解决的,而不是通过在语法中引入上下文敏感性。

    解析

    解析是跟语法密切相关的一个话题。
    解析需要一个语法和一个字符串,并回答两个问题:
    1.字符串是否是文法的语言
    2.字符串相对应的语法结构是什么

    参考:

    The language of languages

    Parsing Techniques: A Practical Guide (Monographs in Computer Science)

    展开全文
  • 上下文无关语法的普通形式化器 需要python 3.x(已测试3.6) 支持的范式 基本上下文无关语法定义 乔姆斯基范式 格赖巴赫范式 输入文字格式 V : [ V | V_0 ], ... SIGMA : [ s | # ], ... S : s0 P : V1 -> s1 V | #,...
  • I . 代数表达式 语法 II . 代数表达式 语法 示例 III . 设计 上下文无关语法 IV . 确定性有限自动机 DFA 转为 上下文无关语法





    I . 代数表达式 语法



    1 . 代数表达式 语法 : G 4 = ( V , A , R , E x p r e s s i o n ) G4 = ( V , A , R , Expression ) G4=(V,A,R,Expression) 是代数表达式语法 ;


    ① 终端字符集 : A = { a , + , × , ( ) } A = \{ a , + , \times , () \} A={a,+,×,()} ;

    ② 变量集 : V = { E x p r e s s i o n , T e r m , F a c t o r } V = \{ Expression , Term , Factor \} V={Expression,Term,Factor} ;

    • E x p r e s s i o n Expression Expression 是表达式 ;
    • T e r m Term Term 是项 ;
    • F a c t o r Factor Factor 是因子 ;

    2 . E x p r e s s i o n Expression Expression 表达式 规则 :

    E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term \quad | \quad Term ExpressionExpression+TermTerm

    E x p r e s s i o n Expression Expression ( 表达式 ) 可以通过 E x p r e s s i o n + T e r m ∣ T e r m Expression + Term \quad | \quad Term Expression+TermTerm 代替 ;


    3 . T e r m Term Term 项 规则 :

    T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor \quad | \quad Factor TermTerm×FactorFactor

    T e r m Term Term 项 可以通过 T e r m × F a c t o r ∣ F a c t o r Term \times Factor \quad | \quad Factor Term×FactorFactor 代替 ;


    4 . F a c t o r Factor Factor 因子 规则 :

    F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression \quad | \quad a FactorExpressiona

    F a c t o r Factor Factor 因子 可以通过 E x p r e s s i o n ∣ a Expression \quad | \quad a Expressiona 代替 ;





    II . 代数表达式 语法 示例



    为字符串 ( a + a ) × a (a + a) \times a (a+a)×a 构建 语法分析树 ;


    1 . 起始状态 : 语法的起始状态是 E x p r e s s i o n Expression Expression , 根据 E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term \quad | \quad Term ExpressionExpression+TermTerm 规则 , E x p r e s s i o n Expression Expression 可以使用 T e r m Term Term 替换 , 直接从起始状态 , 使用 T e r m Term Term 替换 E x p r e s s i o n Expression Expression ;

    在这里插入图片描述


    2 . ( a + a ) × a (a + a) \times a (a+a)×a 字符串的语法分析树 :


    符号 : 其中有 × \times × 乘号 ;

    语法分析树 : ( a + a ) × a (a + a) \times a (a+a)×a 中间有 × \times × , 带有 × \times × 乘号的替换规则为 T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor | Factor TermTerm×FactorFactor , 显然该项很显然是一个 T e r m Term Term 项 ;

    在这里插入图片描述


    3 . 根据上述 T e r m → T e r m × F a c t o r Term \to Term \times Factor TermTerm×Factor 可知 , T e r m Term Term 是由 T e r m × F a c t o r Term \times Factor Term×Factor 进行替换的 , 左侧的 ( a + a ) (a + a) (a+a) 是一个 T e r m Term Term , 右侧的 a a a 是一个 F a c t o r Factor Factor ;

    在这里插入图片描述


    4 . 根据 F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression | a FactorExpressiona 规则 , 右侧的 F a c t o r Factor Factor 直接使用 a a a 进行替代 , 可得如下语法分析树 :

    在这里插入图片描述


    5 . 想办法将左侧的 T e r m Term Term 替换成 ( a + a ) (a + a) (a+a) :


    加法只能是 E x p r e s s i o n Expression Expression , 先替换成 E x p r e s s i o n Expression Expression ;


    6 . 这里先使用 F a c t o r Factor Factor 替换 T e r m Term Term : 使用规则 T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor | Factor TermTerm×FactorFactor ;

    在这里插入图片描述


    7 . 在使用 E x p r e s s i o n Expression Expression 替换 F a c t o r Factor Factor : 使用规则 F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression | a FactorExpressiona ;

    在这里插入图片描述


    8 . 使用 E x p r e s s i o n + T e r m Expression + Term Expression+Term 替换 E x p r e s s i o n Expression Expression : 使用规则 E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term | Term ExpressionExpression+TermTerm ;

    在这里插入图片描述


    9 . 使用 T e r m Term Term 替换 左侧的 E x p r e s s i o n Expression Expression : 使用规则 E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term | Term ExpressionExpression+TermTerm ;

    在这里插入图片描述


    10 . 使用 F a c t o r Factor Factor 替换左侧的 T e r m Term Term : 使用规则 T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor | Factor TermTerm×FactorFactor ;

    在这里插入图片描述


    11 . 使用 a a a 替换左侧的 F a c t o r Factor Factor : 使用规则 F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression | a FactorExpressiona ;

    在这里插入图片描述


    12 . 使用 F a c t o r Factor Factor 替换右侧的 T e r m Term Term : 使用规则 T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor | Factor TermTerm×FactorFactor ;

    在这里插入图片描述


    13 . 使用 a a a 替换右侧的 F a c t o r Factor Factor : 使用规则 F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression | a FactorExpressiona ;

    在这里插入图片描述


    最终的 语法分析树为 :

    在这里插入图片描述

    此时可以得到语法分析树 ; 该语法分析树是一个代数表达式 ; 将该语法分析树写出 , 即可理解 上下文无关 语法 ;

    代数表达式就是上下文无关的语法 ;





    III . 设计 上下文无关语法



    给定语言 , 设计上下文无关语法 , 使用该语法可以生成该语言 ;


    上下文无关语法 设计技巧 : 将复杂的语言分解 , 化整为零 , 针对每个部分设计上下文无关的语法 , 最终将这些语法合并在一起 ;


    上下文无关语法 与 自动机 : 如果给定的语言是正则语言 , 是由正则表达式表达的 , 能够找到一个自动机可以识别该语言 , 首先将语言转换成自动机 , 将自动机转化为上下文无关的语法 ;





    IV . 确定性有限自动机 DFA 转为 上下文无关语法



    1 . 确定性有限自动机 ( DFA ) 转为 上下文无关语法 ( CFG ) : 将 确定性有限自动机 ( DFA ) 的指令 , 转为 对应的 上下文无关语法 ( CFG ) 规则 :

    δ ( q i , a ) = q j ⇒ R i → a R j \delta ( q_i, a ) = q_j \Rightarrow R_i \to aR_j δ(qi,a)=qjRiaRj

    δ ( q i , a ) = q j \delta ( q_i, a ) = q_j δ(qi,a)=qj 表示 q i q_i qi 状态下 , 读取字符 a a a , 跳转到 q j q_j qj 状态 ;


    在这里插入图片描述

    2 . 自动机的 状态跳转 转换成 规则 示例 : 上图中的 确定性有限自动机 , 开始状态 A A A 读取 1 1 1 字符 转化成 B B B 状态 , 表示成规则就是

    R A → 1 R B R_A \to 1R_B RA1RB


    3 . 自动机的状态 A A A 读取 字符 a a a 转换成另一个状态 B B B , 都可以转换成对应的规则 R A → a R B R_A \to aR_B RAaRB ;


    4 . 计算能力对比 : 上下文无关语法 的计算能力 要大于等于 自动机的计算能力 ;

    展开全文
  • 上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA ) II . 下推自动机 ( PDA ) 三个状态 III . 下推自动机 ( PDA ) q_{start}qstart状态 IV . 下推自动机 ( PDA ) q_{loop}qloop状态 V . 下推自动机 ( PDA ) q_{accept...





    I . 上下文无关语法 ( CFG ) 转为 下推自动机 ( PDA )



    上下文无关语法 ( CFG ) :

    S → a T b ∣ b S \to aTb | b SaTbb
    T → T a ∣ ε T \to Ta|\varepsilon TTaε


    将上述 上下文无关语法 ( CFG ) 转为 下推自动机 ;





    II . 下推自动机 ( PDA ) 三个状态



    该 自动机 共包含 3 3 3 个状态 , q s t a r t q_{start} qstart , q l o o p q_{loop} qloop , q a c c e p t q_{accept} qaccept , 最后一个状态是 可接受状态 ;

    在这里插入图片描述





    III . 下推自动机 ( PDA ) q s t a r t q_{start} qstart 状态



    1 . 首先在 栈顶 放入 K K K 字符 , 用于当做栈底的标识 ;


    生成指令 : ε , ε → K \varepsilon , \varepsilon \to K ε,εK ;

    开始状态 q s t a r t q_{start} qstart 状态 , 读取 ε , ε → K \varepsilon , \varepsilon \to K ε,εK 指令 , 读取空字符 , 使用 K K K 替换栈顶的空字符 , 就是将 K K K 放入栈中 ;

    状态跳转 : 之后跳转到 q l o o p q_{loop} qloop 状态 ;


    当前的 下推自动机 ( CFG ) 设计 :
    在这里插入图片描述





    IV . 下推自动机 ( PDA ) q l o o p q_{loop} qloop 状态



    1 . q l o o p q_{loop} qloop 状态下 在栈中模仿 上下文无关语法 ( CFG ) 的规则替换 ;


    上下文无关语法 ( CFG ) :

    S → a T b ∣ b S \to aTb | b SaTbb
    T → T a ∣ ε T \to Ta|\varepsilon TTaε


    2 . 对照上述 上下文无关语法 ( CFG ) , 逐条生成指令 :


    S → a T b S \to aTb SaTb 对应的指令 : ε , S → a T b \varepsilon , S \to aTb ε,SaTb , 读取 ε \varepsilon ε 时 , 使用 a T b aTb aTb 替换栈顶的 S S S ; 即如果栈顶是 S S S , 使用 a T b aTb aTb 替换栈顶的 S S S ;

    S → b S \to b Sb 对应的指令 : ε , S → b \varepsilon , S \to b ε,Sb , 读取 ε \varepsilon ε 时 , 使用 b b b 替换栈顶的 S S S ; 即如果栈顶是 S S S , 使用 b b b 替换栈顶的 S S S ;

    T → T a T \to Ta TTa 对应的指令 : ε , T → T a \varepsilon , T \to Ta ε,TTa , 读取 ε \varepsilon ε 时 , 使用 T a Ta Ta 替换栈顶的 T T T ; 即如果栈顶是 T T T , 使用 T a Ta Ta 替换栈顶的 T T T ;

    T → ε T \to \varepsilon Tε 对应的指令 : ε , T → ε \varepsilon , T \to \varepsilon ε,Tε , 读取 ε \varepsilon ε 时 , 使用 ε \varepsilon ε 替换栈顶的 T T T ; 即如果栈顶是 T T T , 使用 ε \varepsilon ε 替换栈顶的 T T T ;

    如果栈上有终端字符 a a a , 要将栈里的终端字符 a a a 移除 , 对应指令是 a , a → ε a , a \to \varepsilon a,aε , 如果读取到字符 a a a 时 , 从栈顶将字符 a a a 移除 ;

    如果栈上有终端字符 b b b , 要将栈里的终端字符 b b b 移除 , 对应指令是 b , b → ε b , b \to \varepsilon b,bε , 如果读取到字符 b b b 时 , 从栈顶将字符 b b b 移除 ;

    在这里插入图片描述





    V . 下推自动机 ( PDA ) q a c c e p t q_{accept} qaccept 状态



    1 . q a c c e p t q_{accept} qaccept 状态 :


    q l o o p q_{loop} qloop 状态下 , 将栈内的除 K K K 外所有的字符都移除完毕 , 开始向 q a c c e p t q_{accept} qaccept 状态跳转 ;

    此时需要生成指令 ε , K → ε \varepsilon , K \to \varepsilon ε,Kε , 读取 空字符 ε \varepsilon ε , 使用 空字符 ε \varepsilon ε 替换栈顶的 K K K 字符 , 此时栈清空了 ;

    在这里插入图片描述





    VI . 下推自动机 ( PDA ) 指令分解



    1 . 非法指令分解


    上述生成的

    • ε , S → a T b \varepsilon , S \to aTb ε,SaTb
    • ε , T → T a \varepsilon , T \to Ta ε,TTa

    两个指令是不合法的 , 在栈中 , 一个字符 ( 或空字符串 ε \varepsilon ε ) 只能由 一个字符 ( 或空字符串 ε \varepsilon ε ) 替换 ;


    上述不合法的规则 , 多个字符替换栈顶的一个字符 , 需要进行分解操作 ;



    2 . ε , S → a T b \varepsilon , S \to aTb ε,SaTb 指令分解流程 :


    q l o o p q_{loop} qloop 状态 跳转到 新的状态 q l o o p 1 q_{loop1} qloop1 , 跳转读取的指令时 ε , S → b \varepsilon , S \to b ε,Sb , 读取空字符 , 然后使用 b b b 替换栈顶的 S S S 字符 ;

    在这里插入图片描述


    q l o o p 1 q_{loop1} qloop1 状态 跳转到 新的状态 q l o o p 2 q_{loop2} qloop2 , 跳转读取的指令时 ε , ε → T \varepsilon , \varepsilon \to T ε,εT , 读取空字符 , 然后使用 T T T 替换栈顶的 ε \varepsilon ε 字符 , 相当于在栈中放入了 T T T 字符 ;

    在这里插入图片描述

    q l o o p 2 q_{loop2} qloop2 状态 跳转到 原来的状态 q l o o p q_{loop} qloop , 跳转读取的指令时 ε , ε → a \varepsilon , \varepsilon \to a ε,εa , 读取空字符 , 然后使用 a a a 替换栈顶的 ε \varepsilon ε 字符 , 相当于在栈中放入了 a a a 字符 ;

    在这里插入图片描述


    分解 ε , S → a T b \varepsilon , S \to aTb ε,SaTb 后的 3 3 3 个指令 :

    • ε , S → b \varepsilon , S \to b ε,Sb
    • ε , ε → T \varepsilon , \varepsilon \to T ε,εT
    • ε , ε → a \varepsilon , \varepsilon \to a ε,εa

    上述三个指令都是合法的 , 上述 3 3 3 个指令 串联后的效果等价于 ε , S → a T b \varepsilon , S \to aTb ε,SaTb 操作 , 等价于上下文无关语法的 S → a T b S \to aTb SaTb 规则效果 ;



    3 . ε , T → T a \varepsilon , T \to Ta ε,TTa 指令分解流程 :


    q l o o p q_{loop} qloop 状态 跳转到 新的状态 q l o o p 3 q_{loop3} qloop3 , 跳转读取的指令时 ε , S → a \varepsilon , S \to a ε,Sa , 读取空字符 , 然后使用 a a a 替换栈顶的 S S S 字符 ;

    在这里插入图片描述

    q l o o p 3 q_{loop3} qloop3 状态 跳转到 原来的状态 q l o o p q_{loop} qloop , 跳转读取的指令时 ε , ε → T \varepsilon , \varepsilon \to T ε,εT , 读取空字符 , 然后使用 T T T 替换栈顶的 ε \varepsilon ε 字符 , 相当于在栈中放入了 T T T 字符 ;

    在这里插入图片描述


    分解 ε , T → T a \varepsilon , T \to Ta ε,TTa 后的 2 2 2 个指令 :

    • ε , S → a \varepsilon , S \to a ε,Sa
    • ε , ε → T \varepsilon , \varepsilon \to T ε,εT

    上述 2 2 2 个指令都是合法的 , 上述 2 2 2 个指令 串联后的效果等价于 ε , T → T a \varepsilon , T \to Ta ε,TTa 指令 , 等价于上下文无关语法的 T → T a T \to Ta TTa 规则效果 ;





    VII . 最终转换成的 下推自动机 ( PDA ) 结果



    最终的 上下文无关语法 ( CFG ) 转为的 下推自动机 ( PDA ) 样式 :

    在这里插入图片描述

    上下文无关语法 ( CFG ) 与 下推自动机 ( PDA ) 是等价的 , 给定一个 下推自动机 ( PDA ) , 构造 上下文无关语法 ( CFG ) , 该语法生成的语言 , 就是该 下推自动机 ( PDA ) 所认识的语言 ;

    展开全文
  • I . 上下文无关语法 设计 示例 II . 上下文无关语法 的歧义性 III . Chomsky 范式 IV . 上下文无关语法 转为 Chomsky 范式 V . 上下文无关语法 转为 Chomsky 范式 示例





    一、上下文无关语法 设计 示例



    1 . 上下文无关语法 设计要求 : 设计一个语法 , 使用该语法生成语言 w w w , 该 w w w 语言的字符串的开始和结尾的字符是相同的 ;


    2 . 设计方法 : 非确定性优先自动机 ( NFA ) 识别某语言 , 将 NFA 转为 确定性优先自动机 ( DFA ) , 然后将 DFA 转为 上下文无关语法 ;


    3 . 语法设计要求分析 :

    • 开始字符 要么是 0 0 0 , 要么就是 1 1 1 ;

    • 如果开始字符是 0 0 0 , 对应的结尾字符也是 0 0 0 ;

    • 如果开始字符是 1 1 1 , 对应的结尾字符也是 1 1 1 ;


    4 . 初始状态 S S S 规则 : 上述语法描述转为规则 如下 , 其中 S S S 为初始状态 ;

    S → 0 S ′ 0 ∣ 1 S ′ 1 S \to 0S'0 | 1S'1 S0S01S1


    5 . S ′ S' S 规则 : S ′ S' S 表示中间的字符串 , 这个 S ′ S' S 字符串可以是任意字符串 , 根据下面的规则可以生成任意的 0 , 1 0,1 0,1 组成的字符串 ;

    S ′ → 0 S ′ ∣ 1 S ′ ∣ ε S' \to 0S' | 1S' | \varepsilon S0S1Sε





    二、上下文无关语法 的歧义性



    给出如下上下文无关语法 ( CFG ) :

    E x p r e s s i o n → E x p r e s s i o n + E x p r e s s i o n ∣ E x p r e s s i o n × E x p r e s s i o n ∣ E x p r e s s i o n ∣ a Expression \to Expression + Expression | Expression \times Expression | Expression | a ExpressionExpression+ExpressionExpression×ExpressionExpressiona

    语法的含义是 :

    • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n + E x p r e s s i o n Expression + Expression Expression+Expression 替换 ;
    • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n × E x p r e s s i o n Expression \times Expression Expression×Expression 替换 ;
    • E x p r e s s i o n Expression Expression 可以被 E x p r e s s i o n Expression Expression 替换 ;
    • E x p r e s s i o n Expression Expression 可以被 a a a 替换 ;

    1 . 语法的有歧义性 : 同样的一个字符串 , 可以有不同的语法分析树 ;


    ① 语法分析树 1 :

    在这里插入图片描述

    2 . 在上述的 语法分析树中 , 加法优先级高于乘法 , 这是错误的分析 ;


    ② 语法分析树 2 :

    在这里插入图片描述

    在上述的 语法分析树中 , 乘法优先级高于加法 , 这是正确的分析 ;


    3 . 语法歧义性分析 : 上述语法中是无法区分 加法 和 乘法的优先级的 , 因此这里得到两个完全不一致得我语法分析树 , 那么该语法是有歧义的 ;


    4 . 与代数表达式语法对比 : 之前讲的代数表达式是好的语法 , 乘法 和 加法的优先级 也体现出来 , 乘法优先级高于加法 , 括号的优先级高于乘法 ;


    ① 代数表达式语法 :

    • E x p r e s s i o n → E x p r e s s i o n + T e r m ∣ T e r m Expression \to Expression + Term \quad | \quad Term ExpressionExpression+TermTerm
    • T e r m → T e r m × F a c t o r ∣ F a c t o r Term \to Term \times Factor \quad | \quad Factor TermTerm×FactorFactor
    • F a c t o r → E x p r e s s i o n ∣ a Factor \to Expression \quad | \quad a FactorExpressiona

    ② 代数表达式语法分析树 : 这个语法分析树是唯一的 , 没有其它的形式 , 该语法是没有歧义的 ;

    在这里插入图片描述

    ③ 有歧义的语法 : 在本节的语法中 , 无法区分 加法 和 乘法的优先级 , 该语法是有歧义的 ;


    5 . 总结 : 如果语法有歧义 , 那么中间的字符串有歧义 ; 没有算法 可以判定 上下文无关语法 是否有歧义 ; 有些语法天生就是有歧义的 , 但可以通过某种方法去掉语法中的歧义性 ;





    三、Chomsky 范式



    1 . Chomsky 范式 : 上下文无关语法中的任何规则都是如下格式 ;


    A → B C A \to BC ABC : A A A 是 变元 , B , C B,C B,C 也是变元 ;

    A → a A \to a Aa : A A A 是 变元 , a a a 是常元 , A A A 可以被终端字符替换 ;

    B , C B ,C B,C 变元要求 : B , C B, C B,C 变元一定不能是开始变元 ;

    S → ε S \to \varepsilon Sε : S S S 开始变元可以为空 ;

    不能出现 变 元 → 变 元 变元 \to 变元 单个变元 到 单个变元不允许出现 ;


    2 . S → ε S \to \varepsilon Sε 规则 说明 :


    ① 语言包含空字符串 : 如果上下文无关语法包含空字符串时 , 一定需要 S → ε S \to \varepsilon Sε 规则 ;

    ② 语言不包含空字符串 : 如果上下文无关语法不包含空字符串时 , 一定不需要 S → ε S \to \varepsilon Sε 规则 ;

    ③ 规则总结 : 该规则决定 上下文无关语法 所生成的语言 是否包含 空字符串 , 如果包含必须要这个规则 , 如果不包含空字符串一定不要这个规则 ;





    四、上下文无关语法 转为 Chomsky 范式



    Chomsky 范式规则 的 上下文无关语法 生成的语言 的语法分析树 除叶子节点之外 都 是二叉树 , 叶子节点 与 上一层都是 一对一的节点 ;

    任何 上下文无关语法 , 都可以找到一个 Chomsky 范式 与其等价 ;

    任何 上下文无关语法 的语法分析树 都可以进行修剪 , 修剪后的树都是二叉树 ;



    上下文无关语法 转为 Chomsky 范式 步骤 :



    1 . 添加开始变元及规则 : 添加一个新的开始变元 S 0 S_0 S0 , 以及配套的规则 S 0 → S S_0 \to S S0S , S S S 是旧的开始变元 ;


    ① 目的 : 添加开始变元的目的是 开始变元 永远出现在左边 ;

    ② Chomsky 范式 中 , 开始变元始终在规则的左边 , 不允许开始变元在规则的右侧 ;

    ③ 对应 Chomsky 范式 规则 : A → B C A \to BC ABC 规则 , A A A 是 变元 , B , C B,C B,C 也是变元 , 并且 B , C B,C B,C 不允许是开始变元 ;


    2 . 消除所有的 ε \varepsilon ε 规则 : 消除所有从 变元 到 空字符 的规则 ;


    3 . 消除所有的 A → B A \to B AB 规则 : 消除所有从 单个变元 到 单个变元的 单条规则 , 允许从 单个变元 到 多个变元或常元 ;

    A → B A \to B AB 是需要删除的 , A → B S A \to BS ABS 可以保留 ;





    五、上下文无关语法 转为 Chomsky 范式 示例



    将 上下文无关语法 G 6 G6 G6 转为 Chomsky 范式 :

    • S → A S A ∣ a B S \to ASA | aB SASAaB
    • A → B ∣ S A \to B|S ABS
    • B → b ∣ ε B \to b|\varepsilon Bbε

    转换过程如下 :


    1 . 添加新的开始变元 : S 0 S_0 S0 , 旧的开始变元 S S S 就不是开始变元了 ;

    当前的语法格式如下 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ a B S \to ASA | aB SASAaB
    • A → B ∣ S A \to B|S ABS
    • B → b ∣ ε B \to b|\varepsilon Bbε

    2 . 消除 ε \varepsilon ε 规则 :


    消除 ε \varepsilon ε 规则 原则 : 假设有规则 C → ε C \to \varepsilon Cε , D → u C v D \to uCv DuCv , 如果要删除 ε \varepsilon ε 规则 , 需要实现 消除前后具有 相同的替换效果 , 将规则改为 D → u v D \to uv Duv 即可删除 ε \varepsilon ε 相关规则 ;
    ( 消除前后 , 替换效果必须一致 )



    3 . 消除 B → b ∣ ε B \to b|\varepsilon Bbε 中的 ε \varepsilon ε : 会影响 S → A S A ∣ a B S \to ASA | aB SASAaB A → B ∣ S A \to B|S ABS 两条规则中涉及到了 B B B 变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;


    3.1 . S → A S A ∣ a B S \to ASA | aB SASAaB 规则消除 ε \varepsilon ε 分析 : 这里讨论 消除 B → b ∣ ε B \to b|\varepsilon Bbε 规则中的 B → ε B \to \varepsilon Bε 规则 对 a B aB aB 的影响 ;


    ① 消除 B → ε B \to \varepsilon Bε 规则前分析 : 使用 B → b ∣ ε B \to b|\varepsilon Bbε 规则 对 a B aB aB 进行替换 有两种情况 , 分别是 a b ab ab , a a a , 两种情况 ;


    ② 消除 B → ε B \to \varepsilon Bε 规则后分析 : 如果要消除 B → ε B \to \varepsilon Bε 规则 , 那么消除后的规则是 B → b B \to b Bb , 使用 B → b B \to b Bb 规则对 a B aB aB 进行替换 , 其替换 结果必须是 a b ab ab , a a a , 两种情况 ;


    分析 a b ab ab , a a a 两种结果 :

    • a B aB aB 使用 B → b B \to b Bb 规则替换 , 可以得到 a b ab ab ;

    • a a a 替换结果无法获取 , 此时需要在 a B aB aB 的平级 , 再次添加 a a a 即可达到上述效果 ;

    a B aB aB 最终修改方案 : a B aB aB 改为 a B ∣ a aB|a aBa , 使用 B → b B \to b Bb 规则替换 a B ∣ a aB|a aBa 的结果是 a b ab ab , a a a , 与上述消除 B → ε B \to \varepsilon Bε 规则 前的结果一致 ;


    S → A S A ∣ a B S \to ASA | aB SASAaB 规则对应的消除 B → ε B \to \varepsilon Bε 规则后的结果为

    S → A S A ∣ a B ∣ a S \to ASA | aB | a SASAaBa


    ④ 当前的语法格式如下 : 注意 还没有讨论 A → B ∣ S A \to B|S ABS 规则中的 B B B , B → b ∣ ε B \to b|\varepsilon Bbε 规则中的 ε \varepsilon ε 还不能删除 ;

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ a B ∣ a S \to ASA | aB | a SASAaBa
    • A → B ∣ S A \to B|S ABS : 注意此时该规则不完善 , 还没有删除 ε \varepsilon ε ;
    • B → b B \to b Bb


    3.2 . A → B ∣ S A \to B|S ABS 规则消除 ε \varepsilon ε 分析 : 这里讨论 消除 B → b ∣ ε B \to b|\varepsilon Bbε 规则中的 B → ε B \to \varepsilon Bε 规则 对 B B B 的影响 ;


    ① 消除 B → ε B \to \varepsilon Bε 规则前分析 : 使用 B → b ∣ ε B \to b|\varepsilon Bbε 规则 对 B B B 进行替换 有两种情况 , 分别是 b b b , ε \varepsilon ε , 两种情况 ;


    ② 消除 B → ε B \to \varepsilon Bε 规则后分析 : 如果要消除 B → ε B \to \varepsilon Bε 规则 , 那么消除后的规则是 B → b B \to b Bb , 使用 B → b B \to b Bb 规则对 B B B 进行替换 , 其替换 结果必须是 b b b , ε \varepsilon ε , 两种情况 ;


    分析 b b b , ε \varepsilon ε 两种结果 :

    • B B B 使用 B → b B \to b Bb 规则替换 , 可以得到 b b b ;

    • ε \varepsilon ε 替换结果无法获取 , 此时需要在 B B B 的平级 , 再次添加 ε \varepsilon ε 即可达到上述效果 ;

    B B B 最终修改方案 : B B B 改为 B ∣ ε B|\varepsilon Bε , 使用 B → b B \to b Bb 规则替换 B ∣ ε B|\varepsilon Bε 的结果是 b b b , ε \varepsilon ε , 与上述消除 B → ε B \to \varepsilon Bε 规则 前的结果一致 ;


    A → B ∣ S A \to B|S ABS 规则对应的消除 B → ε B \to \varepsilon Bε 规则后的结果为

    A → B ∣ ε ∣ S A \to B| \varepsilon|S ABεS


    ④ 当前的语法格式如下 : 注意 还没有讨论 A → B ∣ S A \to B|S ABS 规则中的 B B B , B → b ∣ ε B \to b|\varepsilon Bbε 规则中的 ε \varepsilon ε 还不能删除 ;

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ a B ∣ a S \to ASA | aB | a SASAaBa
    • A → B ∣ ε ∣ S A \to B| \varepsilon |S ABεS
    • B → b B \to b Bb


    4 . 消除 A → B ∣ ε ∣ S A \to B| \varepsilon |S ABεS 中的 ε \varepsilon ε : 会影响 S → A S A ∣ a B ∣ a S \to ASA | aB | a SASAaBa 规则中涉及到了 A A A 变元 , 消除的原则是 " 消除前后 , 替换效果必须一致 " ;


    ① 消除 A S A ASA ASA 中的 ε \varepsilon ε , 添加以下项即可 :

    • 第一个 A A A 通过 ε \varepsilon ε 代替 : 添加 S A SA SA 项 ;

    • 第二个 A A A 通过 ε \varepsilon ε 代替 : 添加 A S AS AS 项 ;

    • 两个 A A A 都通过 ε \varepsilon ε 代替 : 是 S S S , 可以不同写 , S → S S \to S SS 没啥意义 ;


    S → A S A ∣ a B ∣ a S \to ASA | aB | a SASAaBa 规则对应的消除 A → ε A \to \varepsilon Aε 规则后的结果为 :

    S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa


    ③ 当前的语法格式如下 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → B ∣ S A \to B| S ABS
    • B → b B \to b Bb


    5 . 消除 A → B A \to B AB 规则 :


    假设要消除 C → D C \to D CD 规则 : 如果语法中有 D → W D \to W DW 规则 , 那么如果消除 C → D C \to D CD , 需要将 C → W C \to W CW 体现出来 ;


    消除 A → B A \to B AB 规则 , 检查 B B B 出现在规则左边的情况 , 这里有 B → b B \to b Bb 规则 , 需要 添加 A → b A\to b Ab 规则后 , 即可删除 A → B A \to B AB 规则 ;


    删除前规则 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → B ∣ S A \to B| S ABS
    • B → b B \to b Bb

    删除后规则如下 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → b ∣ S A \to b| S AbS


    6 . 消除 A → S A \to S AS 规则 :


    ① 消除 A → S A \to S AS 规则 , 检查 S S S 出现在规则左边的情况 , 这里有 S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa 规则 , 需要 添加 A → A S A ∣ A S ∣ S A ∣ a B ∣ a A\to ASA | AS | SA | aB | a AASAASSAaBa 规则后 , 即可删除 A → S A \to S AS 规则 ;


    ② 删除前规则 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → b ∣ S A \to b | S AbS

    ③ 删除后规则如下 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a AbASAASSAaBa


    7 . 分解规则 :


    ① 分解示例 : S → A S A S \to ASA SASA 可以分解为 S → R S \to R SR , R → S A R \to SA RSA

    ② 分解前的规则 :

    • S 0 → S S_0 \to S S0S
    • S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa
    • A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a AbASAASSAaBa

    ③ 分解后的规则 :

    • S 0 → S S_0 \to S S0S

    下面的规则 是 S → A S A ∣ A S ∣ S A ∣ a B ∣ a S \to ASA | AS | SA | aB | a SASAASSAaBa 分解后的规则 :

    • S → R S \to R SR
    • R → S A R \to SA RSA
    • S → A S S \to AS SAS
    • S → S A S \to SA SSA
    • S → a B S \to aB SaB
    • S → a S \to a Sa

    下面的规则 是 A → b ∣ A S A ∣ A S ∣ S A ∣ a B ∣ a A \to b| ASA | AS | SA | aB | a AbASAASSAaBa 分解后的规则 :

    • A → b A \to b Ab
    • A → R A \to R AR
    • A → S A A \to SA ASA
    • A → A S A \to AS AAS
    • A → S A A \to SA ASA
    • A → a B A \to aB AaB
    • A → a A \to a Aa
    展开全文
  • Earley 是一个小程序,给定格式良好的上下文无关语法,以及一个已经通过词性标注程序的输入句子,它可以告诉你这个句子在这个语法中是否有效,如果是这样,以一种很好的格式输出所有可能的解析树。 该项目是的直接...
  • 该存储库包含一个Python包cfg ,该包实现用于进行复杂分析和解析任意上下文无关语法的数据结构和算法。 CFG解析的主要工具是Toma Masaru发现的GLR(通用LR)算法。 还包括Alfred Aho和Jeffrey Ullman描述的几种教学...
  • 简化上下文无关语法。 简化包括以下步骤: 2a. 删除 epsilon 派生(在输入文件中用 $ 表示) 2b. 去除单元产生式(即 S -> A,一个单非终结符的派生) 2c。 删除无用状态(无法访问和非生产状态) 将简化的 ...
  • CFG游戏 只是一个使用上下文无关语法创建文本的小网站
  • ncf_rnn 根据可能不明确的上下文无关语法定义生成概率语法RNN
  • 编译原理 知 识 梳 理 (第一版)   建议先修课程:离散数学、C / C++、数据结构、汇编语言、计算机组成原理。 配套教材: ...编程语言的语法,通常是由上下文无关语法(context-free grammar,上下文
  • 解析中的歧义 • 上下文无关文法为语言分配层次结构 ‣ 公式化为生成语言中的所有字符串 ‣ 预测给定字符串的结构
  • 一、上下文无关文法 ( CFG )、 二、上下文无关文法 ( CFG ) 示例、 三、确定性有限自动机 DFA 转为 上下文无关语法 CFG
  • 一、乔姆斯基范式、 二、上下文无关语法转为乔姆斯基范式步骤、 三、上下文无关语法转为乔姆斯基范式示例1、 四、上下文无关语法转为乔姆斯基范式示例 2
  • 编译程序中常用正则文法表示词法,用上下文无关文法表示语法。那么程序语言中那些属于词法哪些属于语法呢?一个简单的办法,把所有能用正则文法表示的规则成为词法,即我们用尽可能的使用正则文法表示更多的东西,...
  • 语法规则:上下文无关文法(子集-LL文法或LR文法) 语法分析:下推自动机(LL或LR分析器),自上而下和自下而上分析 (这两种都只能处理上下文无关文法的子类) 语法分析器 语法分析器是编译器前端的重要组成部分...
  • 编译原理-词法分析-上下文无关文法

    千次阅读 2019-11-29 15:11:08
    依据: 上下文无关语法 上下文无关文法 前言 正规式来定义一些简单的语言,能表示给定结构的固定次数的重复或者没有指定次数的重复, 但 正规式不能用于描述配对或嵌套的结构 定义 上下文无关文法是四元组( VT...
  • 文章目录一、CFG的定义1.定义3.12....上下文无关文法CFG(Context Free Grammar) 上下文无关语言CFL(Context Free Language) 一、CFG的定义 1.定义3.1 CFG是一个四元组G =(N,T,P,S),其中 (1...
  • 上下文无关文法

    2021-08-28 07:40:04
    文章目录上下文无关文法 上下文无关文法 文法自然地描述了大多数程序设计语言构造的层次化语法结构。例如 Java 中的 if-else 语句通常具有如下形式 if (expression) statement else statement 即一个 if-else 语句...
  • python.nlp随笔(九)上下文无关文法

    千次阅读 2018-05-08 14:47:57
    上下文无关文法(context-free grammar,CFG)是指文法中所有的产生式左边只有一个非终结符,比如:S -&gt; aSbS -&gt; ab这个文法有两个产生式,每个产生式左边只有一个非终结符S,这就是上下文无关文法,...
  • 本文介绍了根据上下文无关文法,使用预测分析法生成语法分析树的步骤。
  • 解读上下文无关文法

    千次阅读 2020-09-28 19:14:07
    何谓上下文无关文法 走一段百度百科的概念: 简单理解 上下文无关文法即是把一个句子揉碎,分为4个部分 非终结符集合:指的是一个句子中不同类型的的短语和子句。 终结符集合:终结符指的是构成文法的最...
  • 上下文无关文法 理解: https://www.zhihu.com/question/21833944
  • 上下文无关是指,一句话的含义与其前后的内容没有或者几乎没有关系,只由自己决定,把它剪切到其他任何位置,也还是原有的意思。 例如: ... a = 0; ... 这是一个赋值语句,无论此语句的前后是什么代码,此语句所...
  • 1.文法及语言的形式表示 每一门编程语法都是有它自己的语法的,实际上,任何程序均可以看做是一定字符集上的一个字符串,而判定一个字符串是否为一...语法规则的描述工具常为:上下文无关文法。 文法是描述语言结构的形
  • 上下文无关文法概述 下推自动机 非上下文无关语言 上下文无关文法的重要性如下 表达能力强大足于表示大多数程序设计语言语法 可以构造有效的分析算法以检验一个给定的字符串是否由某个上下文无关文法产生
  • 什么是语法解析在自然语言中,句子可以分为主谓宾等表示。人们说话的方式(即使是在酒后的胡言乱语)也存在一些结构和规则。语言学中的语法分析的目标就是努力分离出这些语法结构。词语之间绝非是简单的顺序关系,它...
  • 一、上下文无关文法 1.定义 上下文无关文法是这样一个四元组(VT , VN , S, P) VT:终结符集合,非空有限集合,记号名是其同义词 VN:非终结符集合,非空有限集合且VT∩VN=Φ S:开始符号 P:产生式集合,形...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,547
精华内容 13,418
关键字:

上下文无关语法