Wat is een voorbeeld van een lexicale fout en is het mogelijk dat een taal geen lexicale fouten bevat?

voor onze cursus compilertheorie hebben we de taak om een eenvoudige interpreter te maken voor onze eigen ontworpen programmeertaal. Ik gebruik jflex en cup als mijn generatoren, maar ik zit een beetje vast met wat een lexicale fout is. Is het ook aan te raden om de statusfunctie van jflex te gebruiken? het voelt verkeerd omdat het lijkt alsof de parser beter geschikt is om dat aspect aan te pakken. en raadt u andere hulpmiddelen aan om de taal te maken. Het spijt me als ik ongeduldig ben, maar het is dinsdag uitgerekend.


Antwoord 1, autoriteit 100%

Een lexicale fout is elke invoer die door de lexer kan worden afgewezen. Dit is over het algemeen het gevolg van tokenherkenning die aan het einde van de regels valt die u hebt gedefinieerd. Bijvoorbeeld (zonder specifieke syntaxis):

[0-9]+   ===> NUMBER token
[a-zA-Z] ===> LETTERS token
anything else ===> error!

Als je een lexer beschouwt als een eindige-toestandsmachine die geldige invoerstrings accepteert, dan zullen fouten alle invoerstrings zijn die er niet toe leiden dat die eindige-toestandsmachine een accepterende toestand bereikt.

De rest van uw vraag was mij nogal onduidelijk. Als je al een aantal tools hebt die je gebruikt, kun je misschien het beste leren hoe je met die tools kunt bereiken wat je wilt bereiken (ik heb geen ervaring met een van de tools die je noemde).

EDIT: na het herlezen van uw vraag, is er een tweede deel dat ik kan beantwoorden. Het is mogelijk dat een taal geen lexicale fouten bevat – het is de taal waarin elke invoerstring geldige invoer is.


Antwoord 2, autoriteit 17%

Een lexicale fout kan een ongeldig of onaanvaardbaar teken zijn in de taal, zoals ‘@’, dat wordt afgewezen als een lexicale fout voor ID’s in Java (het is gereserveerd).

Lexicale fouten zijn de fouten die door uw lexer worden gegenereerd wanneer hij niet verder kan. Wat betekent dat er geen manier is om een lexemete herkennen als een geldige tokenvoor je lexer. Syntaxisfouten, aan de andere kant, worden door uw scanner gegenereerd wanneer een bepaalde set reedserkende geldige tokens niet overeenkomt met een van de rechterkant van uw grammaticaregels.

het voelt verkeerd omdat het lijkt alsof de
parser is beter geschikt voor verwerking
dat aspect

Nee. Het lijktomdat contextvrij talen omvatten reguliere talen(wat betekent dat een parser het werk van een lexer kan doen). Maar bedenk dat een parser een stapelautomaat is en dat u extra computerbronnen (de stapel) zult gebruiken om iets te herkennen waarvoor geen stapel nodig is om te worden herkend (een reguliere expressie). Dat zou een suboptimale oplossing zijn.

OPMERKING: met reguliere expressie bedoel ik… reguliere expressie in de zin van de Chomsky-hiërarchie, niet een java.util.regex.*-klasse.


Antwoord 3, autoriteit 11%

lexicale fout is wanneer de invoer niet tot een van deze lijsten behoort:
trefwoorden: "if", "else", "main"...
symbolen: '=','+',';'...
dubbele symbolen: ">=", "<=", "!=", "++"
variabelen: [a-z/A-Z]+[0-9]*
cijfers: [0-9]*

voorbeelden: 9var: fout, getal voor karakters, geen variabele en ook geen sleutelwoord.
$: fout

Wat ik niet weet, is of zoiets als meer dan één symbool na elkaar wordt geaccepteerd, zoals “+-“


Antwoord 4

Compiler kan een fout opvangen als de grammatica erin zit!
Het hangt van de compiler zelf af of deze de capaciteit (omvang) heeft om de lexicale fouten op te vangen of niet.
Als tijdens de ontwikkeling van de compiler wordt besloten welke soorten lexicale fouten en hoe (volgens de grammatica) ze zullen worden afgehandeld.
Gewoonlijk heeft alle bekende en meest gebruikte compiler deze mogelijkheden.

Other episodes