回答
Bison解析器根本不讀取輸入。他們通過反覆調用yylex
來獲得一系列令牌。 (或者,用現代野牛,你可以創建一個「推式解析器」,它在連續的調用中被賦予標記)。因此,無論什麼工具yylex
負責輸入。
如果使用flex
創建詞法,您可以使用yy_scan_string
(或yy_scan_bytes
如果你知道字符串是如何長)掃描字符串,而不是從一個文件掃描。有關這些功能的詳細信息,請參見Flex manual。
舉個簡單的例子,你可以把以下兩個功能在您flex
定義文件的末尾,第二%%
後:
void set_input_string(const char* in) {
yy_scan_string(in);
}
void end_lexical_scan(void) {
yy_delete_buffer(YY_CURRENT_BUFFER);
}
,並把這個在您的野牛定義文件的末尾,再次第二%%
後:
/* Declarations */
void set_input_string(const char* in);
void end_lexical_scan(void);
/* This function parses a string */
int parse_string(const char* in) {
set_input_string(in);
int rv = yyparse();
end_lexical_scan();
return rv;
}
然後你可以聲明和使用parse_string
解析字符串。
獲取此錯誤:'錯誤:使用未聲明的標識符'yy_free_buffer'' – tejgop
@TejGop:對不起,內存痙攣。它是'yy_delete_buffer'。修復了答案。請參閱[文檔](http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers) – rici
有沒有這樣做的方式(從字符串讀取),而在中間從文件讀取而不重新啓動野牛的解析狀態?我可以很容易地從字符串中讀取flex,但是當它出現時,由於某種原因,bison會啓動一個新的解析堆棧,而不是繼續現有的堆棧。 – velocirabbit
- 1. flex和野牛:解析字符串不用引號
- 2. 野牛表達式解析失敗C++
- 3. 如何解析if語句野牛
- 4. 如何掃描Flex中的字符串,然後解析它在野牛
- 5. 野牛:使用聯盟語義類型與C++解析器
- 6. 野牛可以解析UTF-8字符嗎?
- 7. 與野牛
- 8. YACC(野牛)解析樹無序打印
- 9. 野牛/ flex解析器進入eclipse
- 10. Flex /野牛多通類解析
- 11. 解析使用flex和野牛的塊
- 12. 野牛修復解析深度
- 13. 使用野牛解析元素列表
- 14. 如何匹配野牛語法中的字符串?
- 15. 解析XML字符串與C#
- 16. 野牛分析器錯誤
- 17. 清除野牛生成解析器的解析器狀態
- 18. 如何使用JISON從野牛文件生成解析器
- 19. 與野牛生成的文件的循環依賴解析
- 20. 製作野牛/ flex解析器折返與積分YYSTYPE
- 21. 柔性/野牛解析器與分段故障編譯
- 22. 解析C++字符串
- 23. 解析字符串C#
- 24. 解析字符串到C++
- 25. C#解析JSON字符串
- 26. Visual C++字符串解析
- 27. 字符串解析在C#
- 28. 解析字符串C
- 29. C#字符串解析
- 30. OBJ-C解析字符串
最有可能的是。你試過什麼了?什麼不起作用? – Kninnug
您需要配置您的詞法分析器,以便它將從字符串中讀取,標記它,並在達到最後時報告EOF(通過返回值0)。您可能需要一個初始化函數和'yylex()'代碼來讀取初始化集。 –
我該怎麼做? – tejgop