yylex()
numaramın bir dosya veya standart girdi yerine bir dizeyi ayrıştırmasını istiyorum. Solaris ile sağlanan Lex ve Yacc ile nasıl yapabilirim? Gerçek lex
değil flex
kullanıyorsanızYY_INPUT, Lex & Yacc (Solaris) içinde stdin yerine bir dizeye nasıl işaretlenir
cevap
Ben sadece bu istediğini bir dize veya karakterleri dönebilirsiniz
int input(void);
Kendi tanımlayabilirsiniz inanıyoruz.
Alternatif olarak, dizeyi bir dosyaya yazabileceğinizi ve dosyayı yyin
akışında açabileceğinizi düşünüyorum. Bunun uygulama ile çalışacağından şüpheleniyorum.
esnek kullanılıyorsa o zaman burada makro YY_INPUT()
,
yeniden tanımlamak düşünüyorum popen kullanarak riskli olmasına rağmen, herhangi bir uygulama ile çalışması gerekir şeydir. i aix, HPUX ve Solaris üzerinde kullandım - bu input()
yeniden tanımlanması yoluyla yapılabilir önce
$ cat a.l
%%
"abc" {printf("got ABC\n");}
"def" {printf("got DEF\n");}
. {printf("got [%s]\n", yytext);}
%%
int main(int argc, char **argv)
{
return(lex("abcdefxyz"));
}
lex(char *s)
{
FILE *fp;
char *cmd;
cmd=malloc(strlen(s)+16);
sprintf(cmd, "/bin/echo %s", s); // major vulnerability here ...
fp=popen(cmd, "r");
dup2(fileno(fp), 0);
return(yylex());
}
yywrap()
{
exit(0);
}
$ ./a
got ABC
got DEF
got [x]
got [y]
got [z]
şöyle söyleniyordu. Ya da ben de bir boru yapmak ve fdopen()
-ed FILE*
kullanmak yyin
olarak kullanmak başka bir yaklaşım.
Yeniden tanımlama YY_INPUT. İşte çalışan bir örnektir, derlemek ve
yacc -d parser.y
lex lexer.l
gcc -o myparser *.c
Girdi globalInputText okunur komutlarla çalıştırın. Bu örneği, genel giriş metnini istediğiniz herhangi bir dize veya istediğiniz herhangi bir giriş kaynağından alacak şekilde değiştirebilirsiniz.
parser.y:
%{
#include <stdio.h>
extern void yyerror(char* s);
extern int yylex();
extern int readInputForLexer(char* buffer,int *numBytesRead,int maxBytesToRead);
%}
%token FUNCTION_PLUS FUNCTION_MINUS NUMBER
%%
expression:
NUMBER FUNCTION_PLUS NUMBER { printf("got expression! Yay!\n"); }
;
%%
lexer.l:
%{
#include "y.tab.h"
#include <stdio.h>
#undef YY_INPUT
#define YY_INPUT(b,r,s) readInputForLexer(b,&r,s)
%}
DIGIT [0-9]
%%
\+ { printf("got plus\n"); return FUNCTION_PLUS; }
\- { printf("got minus\n"); return FUNCTION_MINUS; }
{DIGIT}* { printf("got number\n"); return NUMBER; }
%%
void yyerror(char* s) {
printf("error\n");
}
int yywrap() {
return -1;
}
myparser.c:
başka yaklaşım olarak zaten bağlanmış cevapları belirtilen yy_scan_string kullanmaktır#include <stdio.h>
#include <string.h>
int yyparse();
int readInputForLexer(char *buffer, int *numBytesRead, int maxBytesToRead);
static int globalReadOffset;
// Text to read:
static const char *globalInputText = "3+4";
int main() {
globalReadOffset = 0;
yyparse();
return 0;
}
int readInputForLexer(char *buffer, int *numBytesRead, int maxBytesToRead) {
int numBytesToRead = maxBytesToRead;
int bytesRemaining = strlen(globalInputText)-globalReadOffset;
int i;
if (numBytesToRead > bytesRemaining) { numBytesToRead = bytesRemaining; }
for (i = 0; i < numBytesToRead; i++) {
buffer[i] = globalInputText[globalReadOffset+i];
}
*numBytesRead = numBytesToRead;
globalReadOffset += numBytesToRead;
return 0;
}
- 1. Ubuntu'da Lex ve Yacc nasıl kurulur?
- 2. Emacs TAGS tablosu, lex/yacc dosyalarında #line yönergesiyle karıştırılıyor
- 3. Etkin bir Lex ve Yacc IRC var mı?
- 4. Xcode içinde Yacc ve Lex'u kullanma
- 5. Solaris GDB: Nasıl yürütülür?
- 6. Lex/flex/yacc/bison dosyaları için iyi bir Emacs modu veya yöntemi var mı?
- 7. bukle: Solaris
- 8. YAML ayrıştırma - lex veya el yapımı?
- 9. Örneğin Solaris
- 10. Nasıl bir dizeye
- 11. Doğrulanmış site bir krom uygulamasına nasıl işaretlenir?
- 12. Python urandom'unu bir dizeye nasıl dönüştürebilirim?
- 13. Haskell - nasıl sağlandığını açık bir dosya veya nasıl kullanılır stdin yerine
- 14. Bir programda birden çok YACC dilbilgisi
- 15. sed -i + what SOLARIS
- 16. YACC çıktısını bir AST (simge ağacı) yapılıyor
- 17. StreamReader'ı bir dizeye nasıl dönüştürebilirim?
- 18. okuma Stdin
- 19. Yuvalanmış yorumların kaldırılması bz lex
- 20. Bir kabuk senaryosu bir Solaris bölgesinde çalıştığını nereden biliyor?
- 21. TCP_NODELAY, Solaris üzerindeki BSD soketinde nasıl ayarlanır?
- 22. Vba'da bir dizeye çift tırnak nasıl yazarım?
- 23. Python'da stdin kodlaması nasıl değiştirilir
- 24. Listeyi bir dizeye dönüştürme
- 25. Bir Razor görünümünü bir dizeye nasıl dönüştürürsünüz?
- 26. Bir UIColor'u onaltılık bir dizeye nasıl dönüştürürüm?
- 27. Groovy'deki bir dosyayı bir dizeye nasıl okunur?
- 28. Python'da bir dizeye bir booleanı nasıl bağlarım?
- 29. Özel jQuery olayı window.document için nasıl işaretlenir?
- 30. Emacs'ta C işlevinin gövdesi nasıl seçilir (işaretlenir)?
Ayrıca bkz. [Bir dizgeden ayrıştırma ra bir dosyadan daha fazlası] (http://stackoverflow.com/questions/1909166/how-to-parse-from-a-string-rather-than-a-file). –
Ayrıca bkz. Http://stackoverflow.com/q/1907847/15168. –