CS345H: Programming Languages Lecture 3: Lexical Analysis 1/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 2/38

CS345H: Programming Languages Lecture 3: Lexical Analysis 1/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 2/38

Syntactic Analysis I Main Question: How to give structure to strings CS345H: Programming Languages I Analogy: Understanding an English sentence I First, we separate a string into words Lecture 3: Lexical Analysis I Second, we understand sentence structure by diagramming the sentence Thomas Dillig I Separating a string into words is called lexing and our topic today I Observe that this is not necessarily trivial I Consider the string if x <> 3 then ... Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 1/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 2/38 Outline Lexical Analysis I Informal sketch of lexical analysis I Consider the following L program: if x <> y then I Issues in lexical analysis 3 I Lookahead else "hello" I Ambiguities I This “program” is just a string of characters I Specifying Lexers if x <> y then\n\t3\nelse\n\t"hello" I Regular Expressions I Goal: Portion the input string into substrings where the I Examples of regular expressions substrings are tokens Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 3/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 4/38 What is a Token? Tokens I Tokens correspond to sets of strings I Token is a syntactic category I Identifier in L: strings of letters, digits and ’ ’ starting with a letter I Example in English: noun, verbs, adjectives, . I Integer in L: a non-empty string of digits I In a programming language: constants, identifiers, keywords, whitespaces... I Keywords in L: “let”,“lambda”,“if”, . I Whitespace: a non-empty sequence of blanks, newlines, and tabs Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 5/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 6/38 1 What are Tokens For? Defining a Lexical Analyzer: Step 1 I Classify program substrings according to their role I Define a finite set of tokens I Output of lexical analysis is a stream of tokens... I Tokens describe all items of interest I This means no tokens for items not of interest, such as I ...which is input to the parser comments, whitespaces,... I Parser relies on token distinction I Choice of tokens depends on language and design of the parser I An identifier is treated different than a keyword Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 7/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 8/38 Example Defining a Lexical Analyzer: Step 2 I Describe which strings belong to each token I Recall: I Recall: if x <> y then\n\t3\nelse\n\t"hello" I Identifier in L: strings of letters, digits and ’ ’ starting with a letter I Useful tokens for this expression: Identifier, Keyword, Integer, Relation, Whitespace,... I Integer in L: a non-empty string of digits I Important point: < is a character here, but token is <> I Keywords in L: “let”,“lambda”,“if”, . I Whitespace: a non-empty sequence of blanks, newlines, and tabs Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 9/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 10/38 Lexical Analyzer: Implementation Example I A lexer implementation must do two things: 1. Recognize substrings corresponding to tokens I Recall: 2. Return the value (called lexeme) of the token if x <> y then\n\t3\nelse\n\t"hello" I The lexeme is just the substring I Example: "234" Token: Integer Lexeme: 234 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 11/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 12/38 2 Lexical Analyzer: Implementation True Crimes of Lexical Analysis I Is this as easy as it sounds? I The lexer usually discards “uninteresting” toekens that don’t contribute to parsing I Not quite! I Examples: Comments, whitespaces I Let’s look at some history... Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 13/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 14/38 Lexical Analysis in FORTRAN Example I FORTRAN rule: Whitespace is insignificant I Consider I Example: VAR1 is the same as VA R1 DO 5 I=1,25 DO 5 I=1.25 I Reason: Easy to mess up whitespace when typing punch cards I A terrible design! Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 15/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 16/38 Lexical Analysis in FORTRAN (Cont.) Lookahead I Two important points to take away from this example: I Even our simple example has lookahead issues: 1. The goal is to partition the string. This is implemented by reading left-to-right, recognizing one token at a time I i vs. if 2. Lookahead may be required to decide where one token ends and the next token begins I < vs. <> Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 17/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 18/38 3 Lexical Analysis in PL/I Lexical Analysis in PL/I (cont.) I PL/I array references: array(i) I PL/I keywords are not reserved I PL/I declarations: DECLARE(ARG1,...,ARGN) I This means the following is a legal PL/I program I Cannot tell whether DECLARE is a keyword or array reference IF ELSE THEN THEN = ELSE; ELSE ELSE = THEN until after the ), requiring arbitrary lookahead! I Notice: PL/I will continue to entertain us throughout this course Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 19/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 20/38 Lexical Analysis in C++ Review I Unfortunately, these problems still exist in today’s languages I The goal of lexical analysis is: I C++ template syntax: vector<int> I Partition the input string into lexemes I Identify the token of each lexeme I C++ stream syntax: cin >> var I Left-to-right scan lookahead sometimes required I But there is a conflict with nested templates: ⇒ list<vector<int>> Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 21/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 22/38 Next Regular Languages I We could specify tokens in many ways I We still need a way to describe the (often infinite) set of lexemes of each token I Regular Languages are the most popular I Simple and useful theory I And a way to resolve ambiguities I Is if to variables i and j? I Easy to understand I Is <> to operators < and >? I Efficient to implement Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 23/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 24/38 4 Languages Examples of Languages I Alphabet: English characters Language: English sentences I Alphabet: Not every string of English characters is an English I Definition: Let Σ be a set of characters, A language over Σ is sentence a set of strings from characters drawn from Σ I Alphabet: ASCII Language: C programs I Observe: ASCII character set is different from English character set Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 25/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 26/38 Notation Atomic Regular Expressions I Languages are sets of strings I Single character: 0c0 = “c” I Need some notation for specifying which sets we want { } I Epsilon: ε = “” I The standard notation for regular languages is regular { } expressions Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 27/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 28/38 Compound Regular Expressions Regular Expressions I The regular expressions over Σ are the smallest set of expressions including I ε I Union: A + B = s s A or s B { | ∈ ∈ } I 0c0 where c Σ I Concatenation: AB = ab a A and b B ∈ { | ∈ ∈ } i i I A + B where A, B are regular expressions over Σ I Iteration: A∗ = i 0 A where A = A...i times A ≥ S I AB where A, B are regular expressions over Σ I A∗ where A is a regular expression over Σ I Regular expressions are simple, but very useful Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 29/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 30/38 5 Example: Keyword Example: Integers I Integer: non-empty string of digits I Keywords: lambda, else, if, ... I digit = ’0’ + ’1’ + ’2’ + ’3’ + ’4’ + ’5’ + ’6’ + I Regular Expression: ’lambda’ + ’else’ + ’if’+ ... ’7’ + ’8’ + ’9’ I Note: ’lambda’ short for ’l’ ’a’ ’m’ ’b’ ’d’ ’a’ I integer = digit digit∗ + I Abbreviation: A = AA∗ Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 31/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 32/38 Example: Identifier Example: Whitespace I Identifier: strings of letters or digits, starting with a letter I Whitespace: a non-empty sequence of blanks, newlines and I letter = ’A’+...+’Z’+’a’+...’z’+’_’ tabs + I identifier = letter (letter + digit)∗ I (’ ’ + ’\n’ + ’\t’) I Question: Is (letter∗ + digit∗) the same? Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 33/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 34/38 Example: Phone numbers Last Example: email addresses I Regular expressions are everywhere! I Consider (757)-221-1234 I Consider W&M cs emails: [email protected] format I Σ = digits , (, ) ∪ {− } I Σ = letters { . , @} 3 ∪ I exchange = digit + I name = letter 4 I phone = digit I address = name ’@’ name ’.’ name ’.’ name 3 I area = digit I phone_number = ’(’ area ’)-’exchange’-’phone Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 35/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 36/38 6 Other real-world examples Summary I Regular expressions describe many useful languages I File names I Regular languages are only a specification, we still need an I Grep tool implementation I Anything else? I Next time: Given a string s and a regular expression R is s L(R)? ∈ Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 37/38 Thomas Dillig, CS345H: Programming Languages Lecture 3: Lexical Analysis 38/38 7.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    7 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