 Yeah, can you put a link on the Blackboard submission site to the submission site? Yes. Sure. Then maybe now and I'll go develop it all together. Any other questions? All right, presenter views, good to go. I'll note to what's coming next. So it'll be fun. It's like a hot point. All right. Cool. All right. So we talked about at the end of the programming language, we talked about what are all the components of a compiler and a program analysis system or a program interpretation system, right? So what was the flexible analysis section? What does that actually do? So I think of them like boxes, right? What are the inputs and what are the outputs? In terms of characters and the tokens. Yeah, characters play. More specific than bytes. Yes, that's what I want you to think about, right? It's turning bytes into a series of tokens. So why do we want that? Why is that useful? Because I can tell you that. I'll stay up here. It makes it more abstract. Abstraction. Yeah, exactly, right? It's abstraction. That's one of the default computer science answers, right? We like abstraction. So if you think of something like, oh yeah, because of abstraction. That's a big yes. But yes, it's true because we don't want to deal with the raw bytes. We want to deal with things at a higher level. So cart of flexible analysis is defining the syntax of the language. So what does it mean to be a valid program written in that language? And so why is this important? So why is it important that a programming language must have a clearly defined syntax? Is it important because I put it on the slide? No, because otherwise it's like English. There are just no rules. Yeah, well, there are some rules to English, maybe. Kind of, but a lot of them can be broken in very weird ways, right? Or I may talk to you in a way that's not exactly proper English, but you'll still understand exactly what I mean, right? Unfortunately, we can't rely on the compiler. We can't rely on a program to just infer what we meant. It's like, oh, you misspelled a variable name. It looks very similar to this other variable. You must have made that same variable and not a new variable, right? That would actually be kind of crazy to work with a programming language like that because you have to deal with all those things and worry about you making a mistake, right? So it needs to be clearly specified syntax. And the other also, the language needs to have syntax A so we can write compilers for it, right? So we can compile that program and interpret that program. But D, so U as a programmer can actually write a program in that language, right? And without clearly defined syntax, you won't know what's allowed or what's not allowed. You'll just have to learn to program by trial and error. You're just going to type garbage and see what happens and see if it's valid or not. Did some of you do that? Kind of do that. That's fine. So it's too quick, huh? People who write programs and people who write compilers that compile those programs. We need each of those things. So the input as we talked about is a series of bytes. So bytes are coming into our lexer. And so the key question we're going to be setting here is how do we get from just a string of characters to program execution, right? So we first need to think about, okay, we don't want to deal with just bytes because those are too fine-grained. We want to deal with things like instead of the characters I, followed by the character if, then if token, right? That's something more abstract. It's not the raw character. It's something a little bit more abstract. And this is what a program can understand and it can be done. So the output here, the goal, this is where we're going, is a series of tokens. So when you think lexical analysis, input bytes, output tokens. Bang, that's it. So anything to do with lexing is going to be generating tokens. So how do we know what the valid syntax is for English? So we talked about it a little bit, right? What do we have in English that tells us when things are right or not right? Grammar, what about the grammar? Just the way it's formatted using the alphabet. The way it's formatted using the alphabet? Yeah, what's lower than grammar? So grammar kind of, to me, defines what's a valid sentence or less. So it's a serious English syntax, but it's natural language syntax, but it's not as formal as. Right, but thinking about it at a high level, so we have to grammar which defines kind of how sentences look. What else do we have there? We have a 26-character alphabet. Yes, we have an alphabet, right? You can't just draw whatever you want and say, is this English or not? You can't make up your own letters if that would make this insane, right? Although maybe, I guess, now we're doing that with emojis, but that's the whole issue I don't want to get into. But yeah, so at the basic level, we need to say, okay, what are the characters? What's the broad things? What are we going to use to communicate? So in English, we have the alphabet, plus numbers, and maybe actually some other symbols. We actually have other things. What are some other things that aren't in the alphabet and aren't 0 or 9? Punctuation, what kind of punctuation? Period, x-point, ellipses. Let's somebody else go. Periods, ellipses, estimation points, question marks. What was that? Semicolons, dashes, like long dashes. Actually, there's three different kinds of dashes if you've never looked better before. It blew my mind the first time I learned that. All kinds of stuff, right? And this all encompasses the alphabet. So when you see something, you can say, yes, that is English. But it's not English because it has an n-y in it, and I'm trying to make English language. Unless you're writing something that's like English Spanish thing, whatever, but then you have other things, right? So we have all these characters that compose the alphabet, and we have a higher abstraction from that, right? So when you read this sentence, like think about this little meta, right? When you're reading this sentence in the slide, are you reading it character by character? Are you doing H-O-W-E-V-E-R, comma lines, I forgot that's called, comma, right? And then you go, aha, the word however. And then you go, W-E is we. So how do you know these differences between words? Spaces. Spaces, right? So that can be even considered another character in our language is a space. And those spaces, so if you were to, you know, kind of abstract this, it would be maybe like word, comma, word, word, word, word, word, word, word, word, word, word, word, word, word, word, word, word, word, no barrier to that, right? But you know that they're abstract words. And of course, we can break down words into different types, right? We can have some words or nouns, some words or verbs, some words or adjectives, some words or other things that I've forgotten from my English class that I'm not going to try going to, right? But we have this higher abstraction to think about English, right? And we know words are valid because that was defined in a dictionary, right? Or we know some words are valid because we know the other person will kind of know what we mean, even if we use it a little bit weird. And words, we've categorized words, there's different types of words. And so sentences, right? So we group sentences, I know when a sentence ends and another one begins. Punctuation. Punctuation, yeah, a token, right? A period that says, hey, this is one finished sentence, I'm starting another sentence. And those can be grouped up into paragraphs. How do we know, how do we separate paragraphs? New lines and or indents, depending on the formatting, actually can be kind of difficult. I guess, wow. These are good things to think about when we send emails to people like professors if you just send a huge block of text as opposed to several paragraphs of text that are easy to digest. That's always good. Cool. So we have this structure in English, right? And so in a programming language with syntax, we have the same thing, right? We have an alphabet, we have the set of possible bytes that make sense in our language. Right? So maybe not every byte is valid in every C program. Right? Can you use a smiley face emoji in C? I seriously hope not. Hopefully nobody finds out. If you find something right now, let us know. That would be kind of cool. Actually, there aren't emojis in UTF-A. There are, but I don't think C uses UTF-A. Yeah, C is still UTF-A. Yeah. But you can do it in Python or other languages. I had a professor who did everything in Scala, and that was kind of cool because he was doing math stuff, and so you can have like unicode characters, so you can have like the actual aero character and like union operators and all that stuff. It was like horrible to write, but it looked so great when you're done because it matched up exactly what the math looked like. Right? But this is a decision, and this is the other thing I want us to think about. Right? So we're studying syntax. We're understanding how to do this, but I want you to understand that the people that wrote the C programming language, right, they made decisions about what's going to be in the alphabet of that language. They made decisions about what does it need to be a word, in that sense. What does it need to be a sentence? Right? And those decisions affect you, but ultimately they're just engineering trade-off decisions. Right? So it seems you have this actually, you know, a little bit, I don't know if it's slightly bigger than English, but there are a lot of characters in here, right? That we have to use, and maybe you've gotten used to figuring out where they all are in your keyboard on that row on top. And so, just like we saw in English, the abstraction of words, right? We don't want to deal with characters. We want to deal with words. We want to deal with tokens. And so is where the idea of token comes in. For instance, in C, or a C-like language, what does two equal signs next to each other mean? What does that mean? What does that mean? It's a quality test. It's a quality token, right? It's not two equal signs. It means something more. It's a specific token, right? And maybe somebody has made the error that I've made in a while statement instead of using two equal signs to compare things. You accidentally only use one equal sign, and then you're assigning value instead of testing equality. So one character difference means huge semantic difference for your program. It does something completely wrong, and you're pulling out your hair because it runs and you don't understand what's going on, right? Anybody need to adjust me? The only person that's done that. Cool. Let's start again in the class, or at the end of the semester. See how that goes. Okay. The left angle bracket and the equal sign? What's token is that? Less than or equal. Yeah, less than or equal, right? Semantically to us, it means one thing, even though it's two separate characters. While the character's W-H-I-L-E. Yeah, while token. It's a reserved keyword. Can you have a variable called Y-O-N-C or C plus plus? No. No. That's kind of, can be annoying sometimes. Well, maybe not wild, but maybe there's other things, right? But this is because those five characters next to each other, W-H-I-L-E, are special. They mean something special, right? They're an abstraction. They're a specific token themselves. Cool. If, just the same thing, and if token, right? And what we need to do and really what we're studying here in lexical analysis is how do we precisely specify these tokens? And so how are we going to do this is using patterns. So how many people have taken the 355? How many people are currently taking? Cool. Wow. All right, look around. You should form a support group or something. But, so there'll be a little bit of overlap here if we're covering the same concepts. But here we go in much more detail over there. So the idea is, so we have our alphabet. What's inside the alphabet? Characters. Characters. Yeah, individual bytes characters. Right? But we compose, if we concatenate characters together, we get what we're going to call a string. Right? Seems kind of silly why we need to define that, right? We've been talking about strings our entire programming career up in your education up until now. But we need to have precise definitions because we're going to talk about things like strings. So concatenating alphabet symbols together makes a string. And what we're going to do, so we're going to get a little bit more formal now because we're going to start actually defining what do we need by alphabet? What do we need by string? So we're going to use the sigma, capital sigma for the alphabet. And so we're going to say, so sigma is a finite set. So what do we need to be a finite set? It terminates at some point. And it's countable. Yes. Okay. Yes. So a finite set means that there's a countable, you can count, you know exactly how many elements there are in sigma. Right? So for a given programming language, if I say the language is just the characters a and b, then all programs written in that language can only have the characters a and b, which is very similar to what? Binary. Binary, right? Binary is ones and zeros. And the a's and b's are basically the same thing, right? So we're going to define a string. A string is a sequence of symbols from sigma. And we're going to have some special characters. So this is something we're going to use throughout the course. These things are important. So we're going to use epsilon is the empty string. That is epsilon, right? Yeah. Okay. None. Great. So epsilon is the empty string. Okay. So yes. So this means an empty sequence of symbols. Right? This means no symbols. So we have some rules that fall out from this. So if we concatenate epsilon with some string s, the result is just s. Right? Because epsilon is empty. So if epsilon concatenate with epsilon, what do I get? Epsilon. Epsilon. Cool. And this is just a different way of writing that. So we're going to use concatenation here just as the strings next to each other. So epsilon concatenated with s is the same as s concatenated with epsilon, which is the same as just s. So I'm going to try to do this. I can't guarantee that it happens all the time because as we've seen mistakes happen. So I'm going to try to stylize strings differently. So they'll either be inside double quotes or they'll be italic and dark blue. And this will distinguish between strings, which are sequences of symbols in our language from other things. Cool? Questions? So a string is simply just a sequence of characters. And each character is from a specific alphabet, a given alphabet, one alphabet. So then what do we mean by language? I'm going to define that a little bit more precisely. What was that? Just a set of strings. Just a random set of strings? Yeah, so a set of strings that are all valid programs in our language. We can think of like that. So this would be the set of every possible string that's valid in our language. So sigma is the set of all symbols in our alphabet. And sigma star is the set of all strings in sigma. So what does this mean when we use in the kind of mathematical notation when we use sigma star? It doesn't mean the set of all strings other than sigma. What was that? It can repeat. Yeah, it can repeat. So it's every possible combination of strings that can be made using all the characters from sigma. So for instance, let me flip over here. Hey, it's all working. Isn't that weird? At least for now. Okay, so if we have sigma as we said, if sigma is the symbol a and the symbol b, then sigma star will contain what? What about epsilon? Yeah. Yeah? By using none of those strings in here, we get epsilon? The singleton set of a, the singleton set of b, and ab. Yeah. Wait, you're talking about sets, though. It's sets, but we say we were concatenating, so it's strings. So a set of all strings. Yeah, so it's every possible order matters here, right? So we're not talking about sets, we're talking about strings. So yeah, we'll have a, a, a. We'll also have a, a, a, a. If I just sat here and kept doing this, am I going to stop? No. So what does that tell you about sigma star? It is not a set. It's not a finite set, right? Does an infinite set, it's never going to finish? But if I gave you a string and I said, is this string in sigma star, would you be able to answer that question? Yes. Yes. Right, so if I said a, c, a, is that in, is that an element of sigma star? No, it is not. So we're going to do this, sigma star contains all strings that can be created by combining the alphabet symbols into a string. So, sigma star defines every possible string that can ever be made. So if you think about, like, an infinite, like, a bunch of monkeys inferring a keyboard that only has the characters that are in sigma, every possible thing with those infinite number of monkeys can write all those strings that may be in sigma. Sigma star. So we're going to find a language. So a language is going to be a subset of sigma star. Right? So we're going to say from all possible, sigma star is all possible strings you could ever write in this language. We're going to, oh sorry, with this alphabet, L is going to be just those strings that are valid in programs, or that are valid according to this language. So, very sad, is sigma infinite? No. No, right? You already really defined a cache, a finite set. Sigma star? Yes. Yeah, what are you saying? Is L infinite? Yes. So let me argue yes or no. So we're going to guess it now. Is it infinite? Different number of ways you could write any programs. So yes? Maybe I want to take the no side? Yeah. I was just going to say epsilon star is the subset of epsilon star. That's the infinite set. So therefore it's infinite. Okay, so I'm going to take the other side. You're going to take the other side? Yeah, so I think it's finite. This is actually running into one of the problems with a finite set theory right now. I think it's finite. It needs to be finite. And it's infinitely finite. You can't really define it as finite. So if L is indefinitely large, we wouldn't be able to decide whether or not a particular string is in the language or not until we've compared it against all the strings that are in L, which would take in a long time. But we already said we can tell easily you can decide if a string is in sigma star and sigma star is infinite. Right? I think you said that. I don't know if we decided that. Okay, cool. So if we're taking your word for it, then what else? Easily. Cool. Yeah, I think the algorithm is pretty easy. You look at every character, any character in the string, if every character in the string is in sigma, then that string is going to be in sigma star. Because sigma star is all possible combinations of all characters in sigma. I think that's the only test, but that's just off the top of my head. But that's not defining things that. Right? But part of the thing is, all we have here is L is a subset of sigma star. Right? So who's defining L? We are. We are. The programming language designer is defining L. So really the answer is it depends, right? It depends on what L you're talking about and what rules there are for defining L. Could you write a programming language that has the caveat that let's say, I don't know, the maximum character size is 140 bytes? Yes. Yeah, you could write that language. Would L be finite or infinite in that case? Finite. Finite, because you can enumerate all, every possible combination of letters in your alphabet that are in L are going to be in there. Are most programming languages like this? No. No, right? You can always, and you can think of it this easily, right? You can always add a new line of code to your program. Right? It may not even affect things. You can just keep adding lines of code. Now, there may actually be practical limitations that I don't know what the limitations are from files of both size and input files that L accept. That would be kind of interesting. Something interesting to explore. And so really, there's no hard or fast answers here. Really, both ways are correct, but I want you to think about both ways, right? Because we are defining L, and that's why the answer is, well, my answer is independent, right? Cool. Okay. So the way we are going to precisely define the strings that are in L is through regular expressions. So regular expressions are going to help us precisely define exactly what we mean when we talk about, what strings are in a language L. So, have you ever used regular expressions before? In a job. Somebody is raising a hand, and I want to tell us what they use it for. Yeah, so like to validate or check that mid-user input is valid into the date? Yeah. What language? Ooh, BB, not that nice. Ooh, parsing through and trying to extract information from a lot of your text. What language? JavaScript. JavaScript? Have you got anything else in a different language? Ooh, validating email addresses in Rails. Keep that in mind. We're going to get to that. I'll show you why it's a bad idea later. Cool. Yeah, so the point of this is to talk about that we're not just learning esoteric regular expressions and regular languages and all this because we like to think about theory things, which we do because we're computer scientists, but these are actually things that people use every day in their jobs, right? Regular expressions come up very frequently. So this is one of those beautiful cases where theory needs practice in something that you use all the time. So this is an area where you spend time getting familiar with regular expressions because they're going to come up and they're going to come up a lot. Okay. So tokens, the tokens of the language are typically specified using regular expressions. So that's why we're studying them now in this class. They also have really interesting theoretical components, but for this class it's a much more practical manner. We need a way of precisely identifying what do we mean by a token. So some people that have used regular expressions, especially in a job setting, what were they good for? Why did you use them? Did your boss fold you? Yeah, so they're kind of easy to create rules or validations, so kind of deciding how things match, talking about the matching thing. What did you like it? Hello. Did you like using? I think you could let me that argument against a lot of program languages and frameworks. Yeah, it's a lazy way to get something that kind of appears to work, but it really doesn't. Yeah, so you have to learn, essentially a new language in addition to the language that you're already using. And you can move from like, perl regular expressions to JavaScript regular expressions to maybe vv.net regular expressions. They may all have slightly different impacts for what you're used to, so then things can change that way. What are some of the pros? So we talked about some of the cons. What are some of the good things? So it's actually like, as we'll see, we can describe an infinite, a super large, you know, an it, I actually said something to say super large, but we can describe an infinite set of strings using four or five characters. As long as people know how to interpret that regular expression, you can express very complicated things in a short amount of characters. Definitely. So, you know, they're compact. They're expressive. We'll kind of see just a little bit of where the bounds are on this expressiveness. They're precise, right? I can show you a regular expression, and as long as we're talking about the exact same regular expression language, you should be able to know exactly what strings match that and are in that language, and what strings are outside that language. Why these? I think, hopefully, some of your fellow students have convinced you that people actually do these things. And we're not going to be into it, but they're actually incredibly efficient. So, especially the ones we're going to talk about here, but it's easy, in some sense, in some sense, it's easy to generate an efficient program to match a regular expression. So this is often why it's used in programming and in real world projects. Cool. Okay. Now, so somebody posted on the email list about VM Inception. Now we're kind of in syntax Inception. So, I told you we need to talk about syntax, right? We're going to learn regular expressions so we can define the syntax of a language. But, regular expressions themselves are a language, so we need to define the syntax of regular expressions in order to talk about regular expressions to talk about syntax of languages, right? So we've found ourselves in a loop. Okay, so we're going to do it kind of formally. That's the way we get around this. So, we're going to say that a regular expression is either an empty string, so here we're using this as an empty string, epsilon. So empty string would be no regular expression. The empty string would be, so now, remember, it's okay, it's just like, n, alright. I'm going to do it. Okay. So, we need to find things that are regular expressions, right? So we need to find the syntax of a regular expression. So a regular expression is either going to be one of these things. It's either going to be the empty set, which we'll talk about some entity with that means. It's going to be epsilon. It is going to be, I'll cheat a little bit, okay, good. Make sure I do the syntax, right? Okay, cool. A, where A is an element of sigma, right? So this would be A is some symbol in our language, right? So all symbols in our language are valid regular expressions. Cool. We have r1 bar r2 where r1 and r2 are regular expressions. So what kind of definition is this? Recursive. That's recursive definition, right? Cool. Okay. So this means that bar is a special character essentially in our regular expression language, right? This means something. We'll talk about exactly what it means in a second. The other thing I guess I should note is especially in your academic career, people use syntax differently. So we're going to follow the syntax that I think is closely related to real programming languages. So, you know, if you see, it's slightly different. You're going to have to deal with learning the different things because this is why we're precisely defining exactly what it means. Okay, there we go. r1. r2 where r1 and r2 are regular expressions. So the dot character is a special character. Bracket r left, I should say left, left parenthesis, r right parenthesis where r is a regular expression. R star r is a regular expression. And that's it. No more. Okay. So if I were to ask you a question like is this, oh yes. What is the difference between our first two options here, the empty set and the empty string? We'll talk about that eventually. So right now, I just wanted to find what regular expressions look like. So we have to define that first and then we have to define what do all of these things actually mean. Just like what we're going to do is talk about syntax and then we'll talk about semantics, right? So how does the program look versus what does the program mean? And so we have to do the same thing here. So I want to first build up. So that way, everyone knows when I show you something, this is a regular expression. So to do that, if I give you some string and I say, is this a regular expression, what do you need to know in order to make that determination? I give you the string. I say, is this a regular expression? Can you say yes or no? Yes. Yes? We need the alphabet. Why do we need the alphabet? To check case, yeah, if I number them, right? Case three, right? We need to know what is the alphabet. Exactly. So if I said here, the alphabet is the set containing A and the set containing B, then is this about a regular expression? No, it's a dot in between A and B. Oh, sorry. So yes. But if the language is only A, then it's not, because we have some B that's not in our language, and it's not one of our special regular expression symbols. So the only regular expression symbols, we have the bar, and I'll show you over here. Obviously it looks a little better here. So the dot can either be a period, or an actual dot in the middle. It's just a little annoying to do that on the slides. It could be parentheses, or it could be the star. Questions on that? Yeah. Then we got problems. No, no, no. It would be fine. We would just have to, I mean, these are, so these, the bar, the dot, parentheses, the star, right? These are all arbitrary characters. Are those operators on regular expressions? And are they going to be defined at some point? Yes. We're going to find the semantics of these later. All right. We're talking about the syntax right now. So yeah. There are fours in this. Ah, yeah. We'll talk about that when we get a little bit to semantics. We're going to have some way of dealing with that, but it's not too important. It is important, because how, you know, how would you write a regular expression that matches the bar character? Like, vertical bar. You need some way of doing that, right? So we'll see a little bit later how we do that. But now I'm using things like, ask some questions. Okay. Let's do this. So let's use just the language. The alphabet is just a and b. And so we said, okay, the string a dot b is that a regular expression. Cool. What about a bar b? What about a bar bar b? So let's actually step back a little bit. So why did we know that this one is a regular expression? Which of these rules first applies? Rule four. Rule four. And then rule four only applies at what? If a is a valid regular expression and b is a valid regular expression, or a and b are valid regular expressions? Yes. Yes. Both by rule three. Okay. So now let's look here and we say, okay, is a bar bar b? So which rule would apply there? So first four. Four. Four. So we have, but which is r1 and which one is r2? Yeah. A and b, md. A bar and then r2. Any other problem? Right? So this means that we have to be able to deconstruct this into an r1 and an r2 and a bar. So let's say, we can say r1 is, what, a bar and r2 is what, b? So is r2, is this a regular expression? Yes. Is this a regular expression? No. Yes. md, md, md. Yeah. Yeah. It's a bar. So it's b. md. Yeah. So if... Just a second. Guys, let's... With r1, r1 actually is a bar epsilon. Where's the epsilon? Well, it's empty, right? So... Is there an epsilon in there? No. It's 1. Right? Is there an epsilon in this original string? No. Technically. There is not. Right? We're just talking about just the characters that are in this string. Right? So you're saying a regular expression is either an empty set, which I kind of want to get rid of. It's not very important right now. Epsilon. Right? So let's think about it this way. Is this a valverie expression? Yes? By which rule? 2. 2. Great. Is this a valverie expression? No. Well, 4 first. And so what's r1 in this case? Epsilon. Epsilon. And what's r2? b. Exactly. And so is epsilon a regular expression based on what? 2. 2. And then b is also by 3. So this is valid. So let's go back to here. Is this a valid regular expression? Because there's nothing here. But isn't nothing the empty set? No. That's why I kind of want to get rid of it. You just have to deal with the characters that are here. Think of it another way. Based on what we have here, is this a valid regular expression? Yes? No. So which one of these rules would apply? That's right. 5? Is there a dot in there? No. 3? 7? 7? Is there a star in there? There's a star in there? Did you say that the star is all of the set? No. You're putting your knowledge of what it is and your semantics onto it. We don't have any semantics. Exactly. Just based on looking at these rules, right? We would need a star character for rule 7 to appear. We need parentheses for rule 6 to apply. We need a dot character for rule 5 to apply. A star for rule 4 to apply. So which rule would apply? 3. Yeah. 3. So what's A in this case? It's AB. AB. Is AB in our language? What's in our language? B. A and B is AB in our language. Okay, so we came back. This is not in our language. So what about this? A bar B. Yes. Yes? Yes. What's that first? 4. 4. 4? And R2 would be epsilon and R1 would be everything over here? Yes. And then what's the rule of why? 7. 7 and then what? 6. 6. 7 and 6. 7 and 6. And then 4 and then 1, 3 and 3. Cool. Look at that. We didn't have to define syntax. We're already getting a feel for what A is not a regular expression. Cool. We're going to use regular expressions to define a language, right? We already talked about it. What is a language? Oh, question. Yeah. If I said, is this a regular expression? That's kind of what I wanted to do. Yeah. I don't think it comes up really in what we're going to do. For the rule of 7, for the rule of 7, you can ask that B and B. What was that? With the AB, you have to do the rule of 7, ask that. Because ask that has two elements and B. So the question, so AB, like this, the string AB, is this a regular expression? Yeah. By rule 7, there's no star in here, so the rule 7 can't apply. Right? You would need, so which rule applies here? That's rule 7. 7 applies here where R is A and star is due to rule 7. And then we say, is A a regular expression? Yes, by rule 3. So here, because there's literally no star character in our regular expression string, rule 7 doesn't apply here. Right? So all these rules can only apply when we see the characters. Yeah. That is more to do with semantics. So no, we're going to define the exact semantics of all these things later. It looks like next class. So I have a question. Yes. Is the null character the empty set or like semantically? It would be literally an empty set. So instead of saying like the string containing epsilon, this is the difference between the null character and the string containing epsilon. So it does have, I think it will have some semantic differences in the amount of time. Cool. All right. Let's go to the next class.