CS4200 | Compiler Construction | September 10, 2020 Disambiguation and Layout-Sensitive Syntax

CS4200 | Compiler Construction | September 10, 2020 Disambiguation and Layout-Sensitive Syntax

Disambiguation and Layout-Sensitive Syntax Eelco Visser CS4200 | Compiler Construction | September 10, 2020 Disambiguation and Layout-Sensitive Syntax Syntax Definition Summary Derivations - Generating sentences and trees from context-free grammars Ambiguity Declarative Disambiguation Rules - Associativity and priority Grammar Transformations - Eliminating ambiguity by transformation Layout-Sensitive Syntax - Disambiguation using layout constraints Structure Syntax = Structure module structure let inc = function(x) { x + 1 } imports Common in inc(3) context-free start-symbols Exp end context-free syntax Exp.Var = ID Exp.Int = INT Exp.Add = Exp "+" Exp Let( Exp.Fun = "function" "(" {ID ","}* ")" "{" Exp "}" [ Bnd( "inc" Exp.App = Exp "(" {Exp ","}* ")" , Fun(["x"], Add(Var("x"), Int("1"))) ) Exp.Let = "let" Bnd* "in" Exp "end" ] , App(Var("inc"), [Int("3")]) Bnd.Bnd = ID "=" Exp ) Token = Character module structure let inc = function(x) { x + 1 } imports Common in inc(3) context-free start-symbols Exp end context-free syntax Exp.Var = ID module Common Exp.Int = INT lexical syntax Exp.Add = Exp "+" Exp ID = [a-zA-Z] [a-zA-Z0-9]* Exp.Fun = "function" "(" {ID ","}* ")" "{" Exp "}" INT = [\-]? [0-9]+ Exp.App = Exp "(" {Exp ","}* ")" Exp.Let = "let" Bnd* "in" Exp "end" Lexical Syntax = Context-Free Syntax Bnd.Bnd = ID "=" Exp (But we don’t care about structure of lexical syntax) Literal = Non-Terminal module structure let inc = function(x) { x + 1 } imports Common in inc(3) context-free start-symbols Exp end context-free syntax syntax Exp.Var = ID "+" = [\43] Exp.Int = INT "function" = [\102] [\117] [\110] [\99] [\116] [\105] [\111] [\110] Exp.Add = Exp "+" Exp "{" = [\123] "}" = [\125] Exp.Fun = "function" "(" {ID ","}* ")" "{" Exp "}" "(" = [\40] "," = [\44] Exp.App = Exp "(" {Exp ","}* ")" ")" = [\41] "let" = [\108] [\101] [\116] Exp.Let = "let" Bnd* "in" Exp "end" "in" = [\105] [\110] "end" = [\101] [\110] [\100] Bnd.Bnd = ID "=" Exp "=" = [\61] Layout = Whitespace & Comments module Common let inc = function(x) { x + 1 } lexical syntax in // function application LAYOUT = [\ \t\n\r] inc /* function position */ ( 3 // argument list LAYOUT = "/*" InsideComment* "*/" ) InsideComment = ~[\*] end InsideComment = CommentChar CommentChar = [\*] LAYOUT = "//" ~[\n\r]* NewLineEOF NewLineEOF = [\n\r] NewLineEOF = EOF Layout = (Almost) Everywhere module Common let inc = function(x) { x + 1 } lexical syntax in // function application LAYOUT = [\ \t\n\r] inc /* function position */ ( 3 // argument list LAYOUT = "/*" InsideComment* "*/" ) InsideComment = ~[\*] end InsideComment = CommentChar CommentChar = [\*] LAYOUT = "//" ~[\n\r]* NewLineEOF NewLineEOF = [\n\r] NewLineEOF = EOF Exp.App = Exp "(" {Exp ","}* ")" Exp-CF.App = Exp-CF LAYOUT?-CF "(" LAYOUT?-CF {Exp ","}*-CF LAYOUT?-CF ")" Extension Language Composition = Grammar Composition module extension let imports functional query select = 1 context-free start-symbols Exp fs = select f from A where test f = select context-free syntax in Exp = Query print fs Cond = Exp module functional imports Common context-free syntax Exp = <(<Exp>)> {bracket} … Let( [ Bnd("select", Int("1")) , Bnd( "fs" module query , Query( imports Common ["f"] context-free syntax , ["A"] Query.Query = < , Eq(App(Var("test"), Var("f")), Var("select")) select <QID*> from <QID*> where <Cond> ) ) > ] Cond.And = <<Cond> and <Cond>> {left} , App(Var("print"), Var("fs")) Cond.Eq = <<Cond> == <Cond>> {non-assoc} ) Parsing = Formatting-1 Parsing = Formatting-1 context-free syntax let inc = function(x) { x + 1 } Exp.Var = <<ID>> in inc(3) Exp.Int = <<INT>> end Exp.Add = <<Exp> + <Exp>> Let( Exp.Fun = < [ Bnd( function(<{ID ","}*>){ "inc" <Exp> , Fun(["x"], Add(Var("x"), Int("1"))) } ) > ] , App(Var("inc"), [Int("3")]) Exp.App = <<Exp>(<{Exp ","}*>)> ) Exp.Let = < let <Bnd*> let in inc = function(x){ <Exp> x + 1 end } > in inc(3) Bnd.Bnd = <<ID> = <Exp>> end Completion = Rewrite(Incomplete Structure) Context-Free Grammars Context-Free Grammars Terminals - Basic symbols from which strings are formed Nonterminals - Syntactic variables that denote sets of strings Start Symbol - Denotes the nonterminal that generates strings of the languages Productions - A = X … X - Head/left side (A) is a nonterminal - Body/right side (X … X) zero or more terminals and nonterminals Example Context-Free Grammar grammar start S non-terminals E T F terminals "+" "*" "(" ")" ID productions S = E E = E "+" T E = T T = T "*" F T = F F = "(" E ")" F = ID Abbreviated Grammar grammar start S grammar non-terminals E T F productions terminals "+" "*" "(" ")" ID S = E productions E = E "+" T S = E E = T E = E "+" T T = T "*" F E = T T = F T = T "*" F F = "(" E ")" T = F F = ID F = "(" E ")" F = ID Nonterminals, terminals can be derived from productions First production defines start symbol Notation A, B, C: non-terminals l: terminals a, b, c: strings of non-terminals and terminals (alpha, beta, gamma in math) w, v: strings of terminal symbols Meta: Syntax of Grammars context-free syntax / grammars context-free syntax Grammar.Grammar = < grammar Start.Start = < <Start?> start <ID> <Sorts?> > <Terminals?> <Productions> Sorts.Sorts = < > sorts <ID* > Sorts.NonTerminals = < non-terminals <ID* context-free syntax > Production.Prod = < Terminals.Terminals = < <Symbol><Constructor?> = <Symbol* terminals <Symbol* > > Symbol.NT = <ID> Productions.Productions = < Symbol.T = <STRING> productions Symbol.L = <LCID> <Production* > Constructor.Con = <.<ID> Derivations: Generating Sentences from Symbols Derivations grammar / derivation step: replace symbol by rhs of production productions / E = E "+" E / replace E by E "+" E E = E "+" E / E = E "*" E / derivation: E = "-" E / repeatedly apply derivations E = "(" E ")" E = ID derivation derivation / derives in zero or more steps E E =* "-" "(" ID "+" ID ")" = "-" E = "-" "(" E ")" = "-" "(" ID ")" Meta: Syntax of Derivations context-free syntax / derivations Derivation.Derivation = < derivation <Symbol> <Step* > Step.Step = [= [Symbol*]] Step.Steps = [=* [Symbol*]] Step.Steps1 = [=+ [Symbol*]] Left-Most Derivation grammar derivation / left-most derivation productions E E = E "+" E = "-" E E = E "*" E = "-" "(" E ")" E = "-" E = "-" "(" E "+" E ")" E = "(" E ")" = "-" "(" ID "+" E ")" E = ID = "-" "(" ID "+" ID ")" Left-most derivation: Expand left-most non-terminal at each step Right-Most Derivation grammar derivation / left-most derivation productions E E = E "+" E = "-" E E = E "*" E = "-" "(" E ")" E = "-" E = "-" "(" E "+" E ")" E = "(" E ")" = "-" "(" ID "+" E ")" E = ID = "-" "(" ID "+" ID ")" derivation / right-most derivation E = "-" E = "-" "(" E ")" = "-" "(" E "+" E ")" = "-" "(" E "+" ID ")" = "-" "(" ID "+" ID ")" Right-most derivation: Expand right-most non-terminal at each step Meta: Tree Derivations context-free syntax / tree derivations Derivation.TreeDerivation = < tree derivation <Symbol> <PStep* > PStep.Step = [= [PT*]] PStep.Steps = [=* [PT*]] PStep.Steps1 = [=+ [PT*]] PT.App = <Symbol>"*PT*]>! PT.Str = "'STRING"(! PT.Sym = "'Symbol"( Left-Most Tree Derivation grammar! derivation / left-most derivation! productions! E ! E.A = E "+" E! "# "-" E! E.T = E "*" E! "# "-" "(" E ")"! E.N = "-" E! "# "-" "(" E "+" E ")"! E.P = "(" E ")"! "# "-" "(" ID "+" E ")"! E.V = ID "# "-" "(" ID "+" ID ")" tree derivation / left-most! E ! "# E["-" E]! "# E["-" E["(" E ")"]]! "# E["-" E["(" E[E "+" E] ")"]]! "# E["-" E["(" E[E[ID] "+" E] ")"]]! "# E["-" E["(" E[E[ID] "+" E[ID]] ")"]] Left-Most Tree Derivation tree derivation / left-most! E ! "# E["-" E]! "# E["-" E["(" E ")"]]! "# E["-" E["(" E[E "+" E] ")"]]! "# E["-" E["(" E[E[ID] "+" E] ")"]]! "# E["-" E["(" E[E[ID] "+" E[ID]] ")"]] Meta: Term Derivations context-free syntax / term derivations! Derivation.TermDerivation = <! term derivation! <Symbol> <TStep*! >! ! TStep.Step = ["# [Term*]] ! TStep.Steps = ["#* [Term*]] ! TStep.Steps1 = ["#+ [Term*]]! ! Term.App = "'ID>(<{Term ","}*)>! Term.Str = "'STRING"(! Term.Sym = "'Symbol"( Left-Most Term Derivation grammar! derivation / left-most derivation! productions! E ! E.A = E "+" E! "# "-" E! E.T = E "*" E! "# "-" "(" E ")"! E.N = "-" E! "# "-" "(" E "+" E ")"! E.P = "(" E ")"! "# "-" "(" ID "+" E ")"! E.V = ID "# "-" "(" ID "+" ID ")" term derivation / left-most! E ! "# N(E)! "# N(P(E))! "# N(P(A(E, E))! "# N(P(A(V(ID), E))! "# N(P(A(V(ID), V(ID))) Parse Trees Represent Derivations List<String> YIELD(T : Tree) {! T match { ! [A = Ts] "# YIELDs(Ts);! Str "# [Str];! S =* PT };! }! ! iff! List<String> YIELDs(Ts : List<Tree>) {! Ts match {! [] "# "";! S =* YIELD(PT) [T | Ts] "# YIELD(T) + YIELDs(Ts);! };! } Language Defined by a Grammar L(G) = { w | S "#* w } Language: sentences T(G) = { T | S "#* T } Language: trees L(G) = YIELD(T(G)) Ambiguity 32 Ambiguity: Deriving Multiple Parse Trees grammar! derivation! productions! E "#* ID "+" ID "*" ID E.A = E "+" E! E.T = E "*" E! derivation! tree derivation! E.N = "-" E! E! E "#* E[E[ID] "+" E[E[ID] "*" E[ID]]] E.P = "(" E ")"! "# E "+" E! E.V = ID "# ID "+" E! "# ID "+" E "*" E! "# ID "+" ID "*" E! "# ID "+" ID "*" ID derivation! tree derivation! E! E "#* E[E[E[ID] "+" E[ID]] "*" E[ID]] "# E "*" E! "# E "+" E "*" E! "# ID "+" E "*" E! "# ID "+" ID "*" E! "# ID "+" ID "*" ID Ambiguous grammar: produces >1 parse tree for a sentence Ambiguity: Deriving Abstract Syntax Terms grammar! derivation! productions! E "#* ID "+" ID "*" ID E.A = E "+" E! E.T = E "*" E! derivation! term derivation! E.N = "-" E! E! E ! E.P = "(" E ")"! "# E "+" E! "# A(E, E)! E.V = ID "# ID "+" E! "# A(V(ID), E)!

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    105 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us