Могу ли я использовать строку двойных кавычек в yacc? - PullRequest
0 голосов
/ 05 августа 2011

Пока я вижу только такие вещи, как '<', но никогда не вижу 'abc' и "abc" в файле yacc.

a:
  b '<' c;

Допустимы ли последние два?

1 Ответ

1 голос
/ 06 августа 2011

'abc' = является допустимым символом, поскольку всякий раз, когда вы указываете символ, такой как этот компилятор / препроцессор, просто удаляете последний символ, иногда вы получите «символьные константы должны быть длиной в один или два символа» во время компиляции в ANSI C. Если это такне предоставленный вашим компилятором, тогда он должен был удалить последний 'c' из 'abc'.

, поэтому char ch='abc' ; // is actually equi. to ch = 'ab'

, но при связывании он будет использовать только ch='a', поэтому'abc' является синтаксически правильным, но символически неправильным символом. (Я написал C coz. Мы используем инструмент c89, то есть POSIX C для компиляции входных данных yacc и lex)

Опять же yylex () работает с символами как с базовой функциональной единицей, а не сстрока (что-нибудь внутри двойных кавычек).Таким образом, «abc» не является допустимым символом, даже символом, совпадающим с вводом yylex ().(yylex () принимает строку проверки токена. "10+20" с грамматикой [[:DIGIT:]]+ [-+*/%] [[:DIGIT:]]+
и с токенами 1,0,+,2,0
Токены lex могут по умолчанию идентифицировать без указания грамматики 10 как число + как символ и20 снова как число, так что оно будет соответствовать грамматике, указанной ранее)

вы также можете указать строку в разделе правил для сопоставления, например, ^["I am"] означает совпадение с любой строкой ввода, начинающейся с "Я есть" "I am"совпадать только с вводом, имеющим только строку "I am", не будет совпадать с "I am Swapnil @ vikas.ghode@gmail.com"

...