Presentation laddar. Vänta.

Presentation laddar. Vänta.

15 September, 19991 Lexikala element mm Eftersom C är ett språk, har det ett alfabet och regler för hur bokstäverna kan bilda ord och hur olika strukturella.

Liknande presentationer


En presentation över ämnet: "15 September, 19991 Lexikala element mm Eftersom C är ett språk, har det ett alfabet och regler för hur bokstäverna kan bilda ord och hur olika strukturella."— Presentationens avskrift:

1 15 September, 19991 Lexikala element mm Eftersom C är ett språk, har det ett alfabet och regler för hur bokstäverna kan bilda ord och hur olika strukturella enheter skiljs åt. Detta kallas språkets syntax. Kompilatorn kollar så att syntaxen i programmet är korrekt. För en människa så är en C-källkod en två-dimensionell struktur, men för en kompilator är det en följd av bokstäver som översätts till objektkod, som i sin tur blir översatt till maskinkod för den aktuella maskinen. Efter att preprocessorn (som man kan tänka sig vara en del av ”kompilatorn”) är klar, så samlas bokstäverna i programmet till sk tokens.

2 15 September, 19992 Bokstäver och lexikala element Exempel på bokstäver som kan användas i ett C-program är följande: små bokstäver a b c...z stora bokstäver A B C...Z siffror 0 1 2 3 4 5 6 7 8 9 övriga tecken + - * / = ( ) [ ] ’ ” ! @ # $ % _ | \., ; : ? ”osynliga” tecken som mellanslag, nyradstecken och tabulatortecken. små bokstäver a b c...z stora bokstäver A B C...Z siffror 0 1 2 3 4 5 6 7 8 9 övriga tecken + - * / = ( ) [ ] ’ ” ! @ # $ % _ | \., ; : ? ”osynliga” tecken som mellanslag, nyradstecken och tabulatortecken.

3 15 September, 19993 Syntax regler Vi ska använda ett grammatiksystem för att beskriva C:s syntax (appendix B). Det kallas Backus-Naur Form (BNF) och är en kontext-fri grammatik som utvecklades i början av 1960-talet av John Backus och Peter Naur för att beskriva programmering- språket ALGOL 60 (används numera inte alls). BNF räcker inte riktigt till att beskriva alla korrekta strängar i C, men med vissa utökningar kan den användas. Grammatiken består bl.a. av produktioner (eller regler) som producerar korrekta C strängar.

4 15 September, 19994 Symboler i vår grammatik kursiv stil Indikerar syntaktisk kategori ::= ”Ska skrivas som”-symbol | Eller {} 1 Välj en av posterna inom krullparenteserna {} 0+ Upprepa posten inom krullparenteserna 0 eller fler gånger {} 1+ Upprepa posten inom krullparenteserna 1 eller fler gånger {} opt Valfri post andra poster är slutsymboler i språket kursiv stil Indikerar syntaktisk kategori ::= ”Ska skrivas som”-symbol | Eller {} 1 Välj en av posterna inom krullparenteserna {} 0+ Upprepa posten inom krullparenteserna 0 eller fler gånger {} 1+ Upprepa posten inom krullparenteserna 1 eller fler gånger {} opt Valfri post andra poster är slutsymboler i språket

5 15 September, 19995 Exempel Kategorin letter_or_digit letter_or_digit ::= letter | digit letter ::= lowercase_letter | uppercase_letter lowercase_letter ::= a | b | c |...| z uppercase_letter ::= A | B | C |...| Z digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 letter_or_digit ::= letter | digit letter ::= lowercase_letter | uppercase_letter lowercase_letter ::= a | b | c |...| z uppercase_letter ::= A | B | C |...| Z digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Kategorin alphanumeric_string alphanumeric_string ::= {letter_or_digit} 0+ Vi ser att t.ex. strängarna ”3”, ”ab777c” och null-strängen ”” är alla alfanumeriska strängar.

6 15 September, 19996 Kommentarer För att underlätta att läsa ett program och för att kunna lägga in små förklaringar varför man gör som man gör, så finns det i C möjlighet att lägga in kommentarer. En kommentar börjar med /* och slutar med */. Allt däremellan ignoreras av kompilatorn. Kommentarer är viktiga och ska skrivas då man kodar sitt program (första gången) /* a comment */ /*** another comment ***/ /*****/ /* * Yet another comment */

7 15 September, 19997 Nyckelord Vissa ord är reserverade och kan inte användas som t.ex. variabelnamn autodogoto signed unsigned breakdoubleif sizeof void caseelseint static volatile charenumlong struct while constexternregister switch continue float return typedef defaultforshort union autodogoto signed unsigned breakdoubleif sizeof void caseelseint static volatile charenumlong struct while constexternregister switch continue float return typedef defaultforshort union Redan existerande funktionsnamn som t.ex. printf() bör ej defineras om.

8 15 September, 19998 Identifierare En identifierare består av en sekvens av bokstäver, siffror och/eller det speciella tecknet _ (eng. underscore). De flesta C system skiljer på små och stora bokstäver I variabelnamn (case sensitive). Dvs. temp är inte samma variabel som Temp eller tEmp osv. Exempel på identifierare är k, _id, iamanidentifier2, soami men inte not#me, 101_south eller -plus. identifier ::= {letter | underscore} 1 {letter | underscore | digit} 0+ underscore ::= _ identifier ::= {letter | underscore} 1 {letter | underscore | digit} 0+ underscore ::= _

9 15 September, 19999 Konstanter Det finns olika typer av konstanter i C. Heltalskonstanter som t.ex. 0 och 17 och flyttalskonstanter som t.ex. 1.0 och 3.14159. Det finns dessutom teckenkonstanter som t.ex. ’a’, ’b’ eller ’+’. och som vi ska se i kapitel 3 Vissa teckenkonstanter som ’\n’ (newline) har en speciell mening. Trots att de skrivs med två tecken (\ och n) så representerar de ett enda tecken i C. decimal_integer ::= 0 | positive_decimal_integer positive_decimal_integer ::= positive_digit {digit} 0+ positive_digit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 decimal_integer ::= 0 | positive_decimal_integer positive_decimal_integer ::= positive_digit {digit} 0+ positive_digit ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

10 15 September, 199910 Konstanter Exempel på heltalskonstanter är 0, 77 och 1234567890. Men t.ex. 017 är inte samma sak som 17, därför att heltal som börjar med 0 tolkas som skrivna med basen 8, dvs oktala. Man kan också ange tal i hexadecimal form (bas 16), t.ex. OxF3 eller OxA2. Negativa tal (t.ex. -33 ) räknas som konstanta uttryck.

11 15 September, 199911 Sträng konstanter En sekvens tecken omslutna av citationstecken räknas som en strängkonstant. I kapitel 6 så kommer vi att se att strängar lagras som en endimensionell vektor med tecken. Strängar med en bokstav är inte samma sak som tecken, dvs ”a” (sträng) är inte samma sak som ’a’ (tecken). Om man vill ha med ” i en sträng så måste den förekommas av en \. Samma gäller om man vill ha med \ i en sträng, då skrivs den som \\. Exempel på strängar är ”text”, ”” (tomma strängen), ” /* not a comment” och ”\”hej\”” ( ”hej” ). Däremot är t.ex. /* ”text” */ inte en sträng.

12 15 September, 199912 Operatorer De aritmetiska operatorerna är + (plus), - (minus), * (multiplikation), / (division), % (modulus). Normalt så skriver man a + b (mellanslag för att öka läsligheten) men det är tillåtet att skriva a+b. Vissa symboler har olika betydelse i olika sammanhang. T.ex. så har % olika betydelser i printf(”%d”, a); och i a = b % 7; Parenteser, krullparenteser, komman och semikolon fungerar som avdelare. T.ex. så kan parenteser bestämma prioriteten vid beräkningar.

13 15 September, 199913 Prioritet och associvitet Det finns regler för vilken prioritet och associvitet olika operatorer har. Eftersom uttryck inom parenteser utvärderas först kan parenteser användas för att ändra eller klargöra i vilken ordning operationer utförs. 1 + 2 * 31 + (2 * 3)(1 + 2) * 3 1 + 2 - 3 + 4 - 5(((1 + 2) - 3) + 4) -5

14 15 September, 199914 Prioritet/Associvitet

15 15 September, 199915 Öka/Minska operatorer Vissa operationer är så vanliga att speciella operatorer har skapats. Dessa operatorer är dessutom ofta implementerade som endast en maskininstruktion => väldigt snabb ++ operatorn ökar värdet på en variabel med 1 och -- operatorn minskar värdet med 1. Båda operatorerna kan användas som postfix eller prefix operatorer. Om du använder postfix (t.ex. a++ ), så ökas värdet efter satsen är utförd, medan ++a ökar värdet innan.

16 15 September, 199916 Exempel a: 4 b: 5 a: 5 b: 5 Ger följande resultat:

17 15 September, 199917 Tilldelning Tilldelning är också en operator i C. = har låg prioritet och är höger-vänster associativ. b = 2; c = 3; a = b + c; a = (b = 2) + (c = 3); /* ovanligt men korrekt */ a = b = c = 0; a = (b = (c = 0)); k = k + 2; k += 2;

18 15 September, 199918 Tilldelnings-operatorer Som det nämnts tidigare så finns det många kombinationer av tilldelning och beräkningsoperatorer. = += -= *= /= %= >>= <<= &= ^= != int i=1, j=2, k=3, m=4;


Ladda ner ppt "15 September, 19991 Lexikala element mm Eftersom C är ett språk, har det ett alfabet och regler för hur bokstäverna kan bilda ord och hur olika strukturella."

Liknande presentationer


Google-annonser