Я пытаюсь написать компилятор Cminus (C-subset), но мой профессор требует, чтобы мы могли обрабатывать функции input()
и output()
как системные вызовы (в последнем семестре мы реализовали процессор RISC, который может справиться с этими инструкциями).
Для части input()
мне удалось сделать это правильно с первой попытки (просто сделать шаблон, который соответствует "input()"
), но проблема возникает с output()
. Так как эта функция должна принимать массив или переменную в качестве аргумента, я предполагаю, что в шаблонах Lex мне нужно что-то подобное (ссылаясь на то, что я прочитал здесь ):
digito [0-9]
numero {digito}+
letra [a-zA-Z]
identificador {letra}+({letra}|{digito})*
input "input()"
outputStart "output("
outputSimple {identificador}
outputComplex {identificador}"["identificador"]"
outputEnd ")"
output {outputStart} ({outputSimple} | {outputComplex}){outputEnd}
Но у меня есть следующее определение в моей грамматике:
type: INT | VOID;
fun_decl: type ID LPAREN params RPAREN comp_decl;
где ID - токен, передаваемый от Лекса к Бизону, когда он соответствует строке identificador
Моя проблема в том, что сопоставляется только fun_decl
, но я отвлекся.
Подводя итог, как мне сопоставить output(var)
или output(array[i])
с шаблоном? Это вообще возможно?
Edit1:
Прочитав ответ @rici, мне удалось придумать этот код для производства, отодвинув все от Lex / Flex, касаясь только Bison-YACC (остальная часть кода опущена для ясности):
ativacao : id LPAREN args RPAREN
{
if(strcmp($1->attr.name, "output") == 0)
{
/*code for output system call*/
}
else if(strcmp($1->attr.name, "input") == 0)
{
/*code for input system call*/
} else{
/*code for other function activations*/
}
}
;