... | ... | @@ -51,11 +51,11 @@ namespace ScannerHelper |
|
|
|
|
|
#### Формат .lex-файла
|
|
|
|
|
|
`Определения`
|
|
|
`%%`
|
|
|
`Правила`
|
|
|
`%%`
|
|
|
`Пользовательский код`
|
|
|
`Определения`
|
|
|
`%%`
|
|
|
`Правила`
|
|
|
`%%`
|
|
|
`Пользовательский код`
|
|
|
|
|
|
Пользовательский код содержит описания полей и методов, включаемых в генерируемый класс Scanner.
|
|
|
|
... | ... | @@ -229,61 +229,27 @@ public string TokToString(Tok tok) |
|
|
|
|
|
#### Регулярные выражения, используемые в секции определений
|
|
|
|
|
|
{! style=“background:\#DDDDDD”
|
|
|
|
|
|
`|- `
|
|
|
`| style=`“`width:25px`”` | .`
|
|
|
`| один символ кроме '\n'`
|
|
|
`|-`
|
|
|
`| *`
|
|
|
`| ноль или более повторений`
|
|
|
`|-`
|
|
|
`| +`
|
|
|
`| одно или более повторений`
|
|
|
`|-`
|
|
|
`| ?`
|
|
|
`| ноль или одно повторение`
|
|
|
`|-`
|
|
|
`| []`
|
|
|
`| класс символов, обозначающий любой символ внутри []`
|
|
|
`|-`
|
|
|
`| ^`
|
|
|
`| при использовании внутри [] обозначает отрицание. При использовании вне [] обозначает, что шаблон начинается с начала строки`
|
|
|
`|-`
|
|
|
`| \`
|
|
|
`| начало esc-последовательности (например, \n)`
|
|
|
`|}`
|
|
|
|
|
|
|
|
|
`. один символ кроме '\n'`
|
|
|
`* ноль или более повторений`
|
|
|
`+ одно или более повторений`
|
|
|
`? ноль или одно повторение`
|
|
|
`[] класс символов, обозначающий любой символ внутри []`
|
|
|
`^ при использовании внутри [] обозначает отрицание. При использовании вне [] обозначает, что шаблон начинается с начала строки`
|
|
|
`\ начало esc-последовательности (например, \n)`
|
|
|
|
|
|
Внутри \[\] можно использовать: - для задания диапазона, например \[0-9\] ^ в начале для задания отрицания, например \[^"\\n\] (не кавычки и не символ перехода на новую строку)
|
|
|
|
|
|
#### Примеры регулярных выражений
|
|
|
|
|
|
{
|
|
|
|
|
|
`!style=`“`width:50px`”`| [0-9]`
|
|
|
`| `
|
|
|
`|-`
|
|
|
`| [0-9]+`
|
|
|
`| `
|
|
|
`|-`
|
|
|
`| [0-9]*\.[0-9]+ `
|
|
|
`| \. здесь обозначает точку, т.к. просто . имеет другое значение`
|
|
|
`|-`
|
|
|
`| [+-]?[0-9]+`
|
|
|
`| `
|
|
|
`|-`
|
|
|
`| #.*`
|
|
|
`| комментарий, начинающийся с #, после которого идет ноль или более символов до конца строки`
|
|
|
`|-`
|
|
|
`| \`“`[^`”`\n]*["\n]`
|
|
|
`| кавычка, после которой идет любое количество не кавычек и не символов перехода на новую строку, после которых идет кавычка или переход на новую строку - так может задаваться литеральная строка. Здесь вне [] кавычка предваряется \, поскольку символ " имеет самостоятельный смысл; в [] кавычку можно писать без \, поскольку внутри [] кавычка не имеет самостоятельного смысла`
|
|
|
`|-`
|
|
|
`| [^ \n\t]+`
|
|
|
`| любой символ, не являющийся пробелом, переходом на новую строчку, табулостопом, повторяющийся 1 или более раз`
|
|
|
`|-`
|
|
|
`| ^[ \t]*\n`
|
|
|
`| строка из whitespace - пробелы или знаки табуляции, начинающиеся с начала строки и повторенные ноль или более раз, после которых идет символ перехода на новую строку`
|
|
|
`|}`
|
|
|
`[0-9]`
|
|
|
`[0-9]+`
|
|
|
`[0-9]*\.[0-9]+ \. здесь обозначает точку, т.к. просто . имеет другое значение`
|
|
|
`[+-]?[0-9]+#.* комментарий, начинающийся с #, после которого идет ноль или более символов до конца строки`
|
|
|
` \`“`[^`”`\n]*["\n] кавычка, после которой идет любое количество не кавычек и не символов перехода на новую строку, после которых идет кавычка или переход на новую строку - так может задаваться литеральная строка. Здесь вне [] кавычка предваряется \, поскольку символ " имеет самостоятельный смысл; в [] кавычку можно писать без \, поскольку внутри [] кавычка не имеет самостоятельного смысла`
|
|
|
`[^ \n\t]+ любой символ, не являющийся пробелом, переходом на новую строчку, табулостопом, повторяющийся 1 или более раз`
|
|
|
`^[ \t]*\n строка из whitespace - пробелы или знаки табуляции, начинающиеся с начала строки и повторенные ноль или более раз, после которых идет символ перехода на новую строку`
|
|
|
|
|
|
### Класс Scanner
|
|
|
|
... | ... | @@ -292,10 +258,10 @@ public string TokToString(Tok tok) |
|
|
- Основной метод - int yylex() - возвращает код следующей лексемы (токена)
|
|
|
- Свойства:
|
|
|
|
|
|
`string yytext - текст лексемы`
|
|
|
`int yyline - номер строки лексемы`
|
|
|
`int yycol - номер столбца лексемы`
|
|
|
`int yyleng - длина лексемы`
|
|
|
`string yytext - текст лексемы`
|
|
|
`int yyline - номер строки лексемы`
|
|
|
`int yycol - номер столбца лексемы`
|
|
|
`int yyleng - длина лексемы`
|
|
|
|
|
|
### Основная программа
|
|
|
|
... | ... | |